我需要实施一个数据库来跟踪一个地块的位置。
基本上可以有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]
答案 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。