数据库中的共享关系

时间:2013-09-04 10:18:44

标签: sql database-design shared

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

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

我可以阅读任何建议或参考资料。

感谢

2 个答案:

答案 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)

这实际上取决于cabstrailers的共同点。一种方法是你在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而不是有很多空列