【问题标题】:Abstract/super/sub class-like structure for database design用于数据库设计的抽象/超/子类结构
【发布时间】:2012-01-04 16:36:06
【问题描述】:

在这个问题上,我已经把头撞到墙上几次了。所以我希望能在正确的方向上有所帮助。

我有一张桌子,一张是 ORDERS,一张是 TRAINS,一张是 FLIGHTS,一张是 BUSES。每个订单都应该有单一的运输方式。到目前为止,我的设计由 ORDERS 表中的一个字段组成,该字段说明运输类型(火车、航班、公共汽车)和一个包含指定运输类型的外键的字段。

有没有更好的方法来做到这一点?

【问题讨论】:

标签: mysql database structure


【解决方案1】:

我在 Craig Larman 的“应用 UML 和模式”一书中看到了对这个主题的最佳描述——尽管他是从面向对象的角度而不是从数据库的角度编写的。

在关系世界中有 3 种选择(这是基于拉曼的书):

  • 每个变体的亚型。因此,您创建了一个“order_flight”表 航空公司、座位选择等,以及带有 from_station 的“order_train”, to_station 等。这使表格保持美观和自我描述,但是 让您的 SQL 变得一团糟——它必须针对每个子类型进行更改。
  • 包含所有可能列的单个表:在这种情况下,您有一个包含所有子类型的所有可能字段的单个表。这边走, 您的 SQL 保持简单得多 - 但表变得一团糟,并且
    您依靠您的客户端应用程序来“知道”航班有
    航空公司,但火车没有。
  • 用于具有子类型的公共属性的表,它们将其唯一值存储在自己的表中。这基本上是你选择的 日期;关系可以在“订单”表中设置,也可以在 子类表。

每个选项都有优点和缺点 - 特别是在您事先不知道需要哪些子类型的情况下,第一个选项在数据库端是最简单的,但会造成一些混乱客户端代码。

【讨论】:

  • 一个很好的答案。给人很多见识。我肯定也会去看看这本书。谢谢。
【解决方案2】:

如果它们具有对象结构和子类型-超类型关系,您可以为所有项目使用相同的父对象 ID。不要像树模型那样将它们视为不同的对象。 This thread shows an example

如果您正在使用面向对象的建模,那么您也将在数据库中使用面向对象的结构。因此,如果您正在扩展一个类,那么您也在扩展一个数据行,将它们连接到相同的 ID 号上。这就是为什么我说“对超类型和子类型使用相同的 id,因为您会想要加入超类型和子类型来创建子类型对象。

【讨论】:

  • 感谢您的回答...我不确定您所说的“对象结构”是什么意思?
  • 如果您正在使用面向对象建模,那么您也将使用数据库中的面向对象结构。因此,如果您正在扩展一个类,那么您也在扩展一个数据行,将它们连接到相同的 ID 号上。这就是为什么我说“对超类型和子类型使用相同的 id,因为您会想要加入超类型和子类型来创建子类型对象。
  • 啊……知道了。没想到是这样的。谢谢。
猜你喜欢
  • 2015-12-14
  • 2011-03-17
  • 2012-08-28
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多