2011-10-11 122 views
1

我需要实现数据库来跟踪包裹的位置。数据库超类型/子类型

可以有基本的4个位置,也就是在飞机上,在船上,上了一辆车,在运输办公室。

我需要为这4个位置的独立实体,因为它们都具有各自的多发情况下(例如很多飞机,多辆汽车)

而且,这些4个实体都是由一个管理,只有一个员工(另一个实体)。

我创建了一个叫做作业的关联实体,从而它存储了有关哪些员工在每个4个地点,相似的包含与驾驶员ID飞机ID的航班号的工作。

我已经研究了4个地点的属性,并发现它们可分为汽车作为超和飞机,轮船和汽车的办公室被亚型。

会有LOCATION_ID的独特属性,它告诉我,无论是在飞机上或在超办公室,因此亚型将继承这个属性。

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

EMPLOYEE [EMPLOYEE_ID,employee_name,性别,contact_number,job_scope]

JOB [JOB_ID,(EMPLOYEE_ID),(LOCATION_ID)]

OFFICE [LOCATION_ID,office_id,地址]

CAR [LOCATION_ID,vehicle_id]

飞机[LOCATION_ID,vehicle_id,类型,unladen_weight]

SHIP [LOCATION_ID,vehicle_id ,大小]

+0

我们在这里似乎有点误解,我的不好。看到我下面更新的答案。 –

回答

1

创建一个定位表。

Location-id 
Location-Type 
Description 

(注:第二场是多余的,因为如果该位置是“船”,你会发现在舶表的记录,并在其他地方,但可能是不错的)

位置ID将成为位置表的主键。而这将是轮船,飞机,办公室等的外键

所以我们说要映射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种类型的“位置的一些其他领域“将其添加到位置表。

其余部分应该或多或少OK:您的工作表将在这里指出,每一个“具体的”类将通过与特定的“子”记录加入位置记录获得。

注意:如果你指的是“地理位置”,别的东西,例如“地域”喜欢“亚利桑那”或“墨西哥湾”你必须添加为位置表的属性。对于Office,它将是静态的,而其他类型的“位置”可能随着它们的移动而改变。

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

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

+0

所以在这种情况下,超类型将是位置表,但如何将位置表被链接到4个不同的位置,考虑到也有飞机,轮船等 LOCATION许多情况下[LOCATION_ID,描述]? ship [vehicle_id,unladen_weight]? – user776914

+0

,我目前只在设计,所以我其实不太了解的方式“在其他一些地方”的阶段,编码解释。(我学习使用矩形绘制模型和乌鸦脚符号截至目前) – user776914

+0

的“其他一些地方”是众多解释有关映射在RDBMS对象的层次结构之一,它引用此:http://www.agiledata.org/essays/mappingObjects.html#MappingInheritance这是不是“编码”,以及相当完整。 –