0

抱歉这么无知......但我正在尝试建立一个包含五个表的数据库...... Truck_fleets,cabs,trailers,tyres,tyre_pressures。应该是直截了当的,除了“轮胎”需要是“出租车”和“拖车”的孩子。卡车的驾驶室和卡车的拖车都有轮胎!

在设置它时,我最终在“轮胎”中有两个键,其中只有一个是满意的。那就是轮胎属于驾驶室或拖车。

请在我可以阅读此内容的任何建议或参考资料。

谢谢

4

2 回答 2

1

尝试两个关系表。一种将驾驶室连接到轮胎,称为 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 和它的拖车关联起来,那么这将是另一个关系实体,依此类推。

于 2013-09-05T10:55:00.047 回答
0

这真的取决于有多少cabstrailers有共同点。一种方法是您在表中有两个字段的路线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 而不是有很多空列

于 2013-09-04T10:46:12.837 回答