【发布时间】:2012-01-04 16:36:06
【问题描述】:
在这个问题上,我已经把头撞到墙上几次了。所以我希望能在正确的方向上有所帮助。
我有一张桌子,一张是 ORDERS,一张是 TRAINS,一张是 FLIGHTS,一张是 BUSES。每个订单都应该有单一的运输方式。到目前为止,我的设计由 ORDERS 表中的一个字段组成,该字段说明运输类型(火车、航班、公共汽车)和一个包含指定运输类型的外键的字段。
有没有更好的方法来做到这一点?
【问题讨论】:
在这个问题上,我已经把头撞到墙上几次了。所以我希望能在正确的方向上有所帮助。
我有一张桌子,一张是 ORDERS,一张是 TRAINS,一张是 FLIGHTS,一张是 BUSES。每个订单都应该有单一的运输方式。到目前为止,我的设计由 ORDERS 表中的一个字段组成,该字段说明运输类型(火车、航班、公共汽车)和一个包含指定运输类型的外键的字段。
有没有更好的方法来做到这一点?
【问题讨论】:
我在 Craig Larman 的“应用 UML 和模式”一书中看到了对这个主题的最佳描述——尽管他是从面向对象的角度而不是从数据库的角度编写的。
在关系世界中有 3 种选择(这是基于拉曼的书):
每个选项都有优点和缺点 - 特别是在您事先不知道需要哪些子类型的情况下,第一个选项在数据库端是最简单的,但会造成一些混乱客户端代码。
【讨论】:
如果它们具有对象结构和子类型-超类型关系,您可以为所有项目使用相同的父对象 ID。不要像树模型那样将它们视为不同的对象。 This thread shows an example
如果您正在使用面向对象的建模,那么您也将在数据库中使用面向对象的结构。因此,如果您正在扩展一个类,那么您也在扩展一个数据行,将它们连接到相同的 ID 号上。这就是为什么我说“对超类型和子类型使用相同的 id,因为您会想要加入超类型和子类型来创建子类型对象。
【讨论】: