抱歉这么无知......但是 我正在尝试建立一个包含五张桌子的数据库.... Truck_fleets,cabs,trailers,tyre,tyre_pressures。应该是直截了当的,除了“轮胎”需要是“驾驶室”和“拖车”的孩子。卡车的驾驶室和卡车的拖车都有轮胎!
在设置时,我最终在“轮胎”中使用了两个键,其中只有一个满意。那轮胎属于驾驶室或拖车。
我可以阅读任何建议或参考资料。
感谢
答案 0 :(得分:1)
尝试两个关系表。一个将驾驶室连接到轮胎,称之为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
详细说明一下,这里的理论是实体关系本身就是实体,并根据它们所关联的事物进行输入。您不会正常混合类型,因此我们有两个关系表。
如果您希望关联驾驶室及其预告片,那么这将是另一个关系实体,依此类推。
答案 1 :(得分:0)
这实际上取决于cabs
和trailers
的共同点。一种方法是你在tyre
表中有两个字段的路线,你可能还需要一个检查约束来确保只有一个为空,并且两者都不为空以确保任何轮胎都有一个,只有一个父母。
另一个选择是将拖车和卡车存放在一个表中,并且有一个Type
字段,用于存储卡车或拖车,然后您的轮胎表只需要一个字段即可链接到这个主表的ID。您只需确保此表包含卡车和拖车中的所有列。
另一种选择是使用继承,这类似于单表方法,但如果两种类型之间没有很多重叠列,或者非共享子项,这可能是更好的方法。所以你可能有这样的表:
车辆 {VehicleID(PK),SharedColumn1,SharedColumn2}
卡车 {VehicleID(PK,FK [Vehicle]),TruckColumn1,TruckColumn2}
预告片 {VehicleID(PK,FK [Vehicle]),TrailerColumn1,TrailerColumn2}
轮胎 {TyreID(PK),VehicleID(FK [车辆]),TryeColumn1}
TruckOnlyChild {ID(PK),VehicleID(FK [Truck])}
这3种方法中的每一种都有它的优点和缺点,你真的需要选择哪种优先选择。对于它的价值,我个人会根据我的要求选择后两个选项中的一个。如果属性足够稀疏,我会考虑第二个选项,但使用EAV而不是有很多空列