数据库超类型/子类型

时间:2011-10-11 07:02:35

标签: database-design relational-database

我需要实施一个数据库来跟踪一个地块的位置。

基本上可以有4个地点,即飞机上,船上,汽车上,运输办公室。

我需要为这4个地点设置单独的实体,因为它们都有多个实例(例如很多飞机,很多车)

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

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

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

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

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

员工[ employee_id ,employee_name,gender,contact_number,job_scope]

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

OFFICE [ location_id ,office_id,地址]

CAR [ location_id ,vehicle_id]

AIRPLANE [ location_id ,vehicle_id,type,unladen_weight]

SHIP [ location_id ,vehicle_id,size]

1 个答案:

答案 0 :(得分:1)

创建位置表。

Location-id
Location-Type
Description

(注意:第二个字段是多余的,因为如果Location是“Ship”,你会在Ship表中找到一条记录,而不是其他地方,但可能很高兴)

Location-ID将是Location Table的主键。它将成为船舶,航空,办公室等的外键。

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

位置表:

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

Office Table

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

发货表

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

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

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

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

所以超类型是“位置”,而Office或Ship是“通用”位置的子类型。

这是在RDBMS(btw)中对超类型建模的标准方法,正如已经解释的那样in some other places