很抱歉如此的无知……但是我正在尝试建立一个包含五个表的数据库...Truck_fleets,出租车,拖车,轮胎,tyre_pressures。除了“轮胎”需要是“驾驶室”和“拖车”的孩子之外,应该是直截了当的。卡车的驾驶室和拖车都有轮胎!
在设置它时,我在“轮胎”中有两个键,其中只有一个是满意的。也就是说,轮胎不是属于驾驶室的就是属于拖车的。
任何建议或参考,我可以读到这一点,请。
谢谢
发布于 2013-09-05 18:55:00
尝试两个关系表。一种连接出租车和轮胎,称为cab_tyres;另一种连接拖车和轮胎,称为trailer_tyres。
每个表包含两个id。
cab_tyres:
int cab_id //FK to cab table
int tyre_id //FK to tyre table
trailer_tyres:
int trailer_id //FK to trailer table
int tyre_id //FK to tyre table
简单地说,这里的理论是实体关系本身就是实体,并根据它们相关的事物进行类型化。您通常不会混合类型,因此我们有两个关系表。
如果您希望关联cab和它的尾部,那么这将是另一个关系实体,依此类推。
发布于 2013-09-04 18:46:13
这实际上取决于cabs
和trailers
有多少共同点。一种方法是在您的tyre
表中有两个字段的路由,您可能还需要一个检查约束来确保只有一个为null,而这两个字段都不为null,以确保每个轮胎都有一个,并且只有一个父项。
另一种选择是将拖车和卡车存储在一个表中,并有一个Type
字段来存储它是卡车还是拖车,那么您的轮胎表只需要一个字段就可以链接到这个主表的ID。您只需确保该表包含您在truck和trailer中拥有的所有列。
另一种选择是使用继承,这类似于单表方法,但如果两种类型之间没有太多重叠的列,或者非共享子类型,这可能是一种更好的方法。因此,您可能会有这样的表:
Vehicle { VehicleID (PK),SharedColumn1,SharedColumn2 }
Truck { VehicleID (PK,FK Vehicle),TruckColumn1,TruckColumn2 }
拖车{ VehicleID (PK,FK Vehicle),TrailerColumn1,TrailerColumn2 }
轮胎{ TyreID (PK),VehicleID (FK Vehicle),TryeColumn1 }
TruckOnlyChild {ID (主键),VehicleID (FK卡车)}
这三种方法各有利弊,你真的需要选择哪种方法对你更有利。对于它的价值,我个人会选择后两个选项中的一个,取决于我的需求。如果属性足够稀疏,我会考虑第二种选择,但使用EAV而不是有许多空列
https://stackoverflow.com/questions/18611190
复制相似问题