【问题标题】:database supertype/subtype数据库超类型/子类型
【发布时间】:2011-12-05 01:34:27
【问题描述】:

我需要实现一个数据库来跟踪包裹的位置。

基本上可以有 4 个位置,即在飞机上、在船上、在汽车上、在中转办公室。

我需要为这 4 个位置创建单独的实体,因为它们都有多个实例(例如,许多飞机、许多汽车)

此外,这 4 个实体中的每一个都由一个且只有一个员工(另一个实体)管理。

我创建了一个名为 job 的关联实体,它存储有关在 4 个位置中的每个位置工作的员工的信息,类似于包含飞机 ID 和飞行员 ID 的航班号。

我检查了4个地点的属性,发现它们可以分为car是超类型和飞机,船和办公室是汽车的子类型。

会有一个 location_id 的唯一属性,它告诉我它是在飞机上还是在超类型中的办公室,因此子类型将继承此属性。

我的问题是在表格设计中,由于位置将被分成四个不同的表格,每当我从工作实体中引用 location_id(FK) 时,是否仍然可以这样做,因为外键通常只链接到一个在这种情况下,表而不是 4 个表..

EMPLOYEE [employee_id、employee_name、性别、contact_number、job_scope]

工作 [job_id, (employee_id), (location_id) ]

OFFICE [location_id、office_id、地址]

CAR [location_id,vehicle_id]

AEROPLANE [location_id, vehicle_id, type, unladen_weight ]

SHIP [location_id,vehicle_id,尺寸]

【问题讨论】:

  • 我们这里好像有点误会,我的错。请参阅下面的更新答案。

标签: database-design relational-database


【解决方案1】:

创建位置表。

Location-id
Location-Type
Description

(注意:第二个字段是多余的,因为如果 Location 是“Ship”,您会在 Ship 表中找到一条记录,但在其他任何地方都找不到,但最好有)

Location-ID 将是位置表的主键。它将是 Ship、Air、Office 等的外键。

假设您要映射 2 个“位置”,一个是船,另一个是办公室。

位置表:

Location-Id | Location-Type | Description
      ...   | ...           | ... 
     005768 | Ship          | "The Sea Witch" Mexican Cargo
      ...   | ...           | ...
     087956 | Office        | "Our offices in Albuquerque"

办公桌

Office-Id | Address 
   ...    | ...
   087956 | "145 Rose St. Albuquerque"
   ...    | ...

发货表

  Ship-Id | Size 
   ...    | ...
   005768 | 14000
   ...    | ...

如果您设法找到所有 4 种“位置”类型都存在的其他字段,请将其添加到位置表中。

其余的应该或多或少没问题:您的 Job 表将指向此处,并且每个“具体”类都将通过将 Location 记录与特定“子类型”记录相结合来获得。

注意:如果您将“位置”表示为其他内容,例如“地理区域”,如“亚利桑那州”或“墨西哥湾”,则必须将其添加为位置表的属性。对于 Office,它将是静态的,而其他类型的“位置”可能会随着它们的移动而改变。

所以超类型是“位置”,而办公室或船舶是“通用”位置的子类型。

这是在 RDBMS 中为超类型建模的标准方法,顺便说一句,正如 in some other places 已经解释的那样。

【讨论】:

  • 所以在这种情况下,超类型将是位置表,但考虑到飞机、轮船等的许多实例,位置表将如何链接到 4 个不同的位置。位置 [location_id , 描述] ?船 [ vehicle_id, unladen_weight ] ?
  • 而我目前只处于设计阶段,所以我实际上不太了解“在其他地方”在编码中的解释方式..(我学习使用矩形和鱼尾纹的绘图模型截至目前的符号)
  • “其他地方”是关于在 RDBMS 中映射对象层次结构的众多解释之一,它引用了这一点:agiledata.org/essays/mappingObjects.html#MappingInheritance 这不是“编码”,而且相当完整。
  • 我已经大致明白了,所以 location_id 将是办公室、飞机、轮船和汽车的外键。因为据我了解,它与将其链接到另一个表的 pk 的外键之间存在直接关系。所以如果我们把它建模为这个超类型的例子,pk实际上会链接到四个fk,这在实际实现中实际上是可能的?
  • @Jimmy - 子类型“指向”超类。决定这一点非常明显,因为(至少在约定 RDBMS 中)您不能让 FK 进入多个表,正如 OP 在上面的评论中所说的那样。
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2012-01-22
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多