在这件事上我已经把头撞到墙上好几次了。所以我希望在正确的方向上得到一点帮助。
我有一张 table ,上面有订单,一张 table 上有火车,一张 table 上有航类,一张 table 上有巴士。每个订单应该有单一的运输方式。到目前为止,我的设计由 ORDERS 表中的一个字段组成,该字段说明交通类型(火车、航类、公共(public)汽车),以及一个包含所述交通类型的外键的字段。
有没有更好的方法来做到这一点?
最佳答案
我在 Craig Larman 的书《应用 UML 和模式》中看到过对此主题的最好描述 - 尽管他是从面向对象的角度而不是数据库的角度进行写作的。
关系世界中有 3 种选择(这是基于 Larman 的书):
- 每个变体的子类型。因此,您创建一个“order_flight”表 航空公司、座位选择等,以及带有 from_station 的“order_train”, to_station 等。这使表格保持良好且具有 self 描述性,但是 让你的 SQL 变得一团糟 - 它必须针对每个子类型进行更改。
- 包含所有可能列的单个表:在这种情况下,您有一个包含所有子类型的所有可能字段的单个表。这边走,
你的 SQL 仍然简单得多 - 但表变得一团糟,并且
您依靠您的客户端应用程序来“了解”航类
航空公司有,但火车没有。 - 通用属性表,子类型将其唯一值存储在自己的表中。这基本上就是你所选择的 日期;该关系可以在“order”表中设置,也可以在 子类表。
每个选项都有优点和缺点 - 特别是在您事先不知道需要哪些子类型的情况下,第一个选项在数据库端是最简单的,但会造成一些困惑客户端代码。
关于mysql - 用于数据库设计的抽象/超/子类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8241286/