抱歉这么无知......但我正在尝试建立一个包含五个表的数据库...... Truck_fleets,cabs,trailers,tyres,tyre_pressures。应该是直截了当的,除了“轮胎”需要是“出租车”和“拖车”的孩子。卡车的驾驶室和卡车的拖车都有轮胎!
在设置它时,我最终在“轮胎”中有两个键,其中只有一个是满意的。那就是轮胎属于驾驶室或拖车。
请在我可以阅读此内容的任何建议或参考资料。
谢谢
抱歉这么无知......但我正在尝试建立一个包含五个表的数据库...... Truck_fleets,cabs,trailers,tyres,tyre_pressures。应该是直截了当的,除了“轮胎”需要是“出租车”和“拖车”的孩子。卡车的驾驶室和卡车的拖车都有轮胎!
在设置它时,我最终在“轮胎”中有两个键,其中只有一个是满意的。那就是轮胎属于驾驶室或拖车。
请在我可以阅读此内容的任何建议或参考资料。
谢谢
尝试两个关系表。一种将驾驶室连接到轮胎,称为 cab_tyres,另一种将拖车连接到轮胎,称为 trail_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 和它的拖车关联起来,那么这将是另一个关系实体,依此类推。
这真的取决于有多少cabs
和trailers
有共同点。一种方法是您在表中有两个字段的路线tyre
,您可能还需要一个检查约束以确保只有一个为空,并且两者都不为空以确保任何轮胎都有一个,并且只有一个父母。
另一种选择是将拖车和卡车存储在一个表中,并有一个Type
字段存储它是卡车还是拖车,然后您的轮胎表只需要一个字段来链接到该主表的 ID。您只需要确保此表包含卡车和拖车中的所有列。
另一种选择是使用继承,这类似于单表方法,但如果两种类型之间没有太多重叠列,或者非共享子项,这可能是一种更好的方法。所以你可能有这样的表:
车辆{ 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 (PK), VehicleID (FK [Truck]) }
3 种方法各有利弊,您确实需要选择对您有利的方法。对于它的价值,我个人会根据我的要求选择后两个选项之一。如果属性足够稀疏,我会考虑第二个选项,但使用 EAV 而不是有很多空列