0

[主要编辑:感谢 Branko 关于继承的提示]

业务 ( business_id )

OFFICE ( office_id , business_id, office_name) office_id 是 PK 的序列;business_id 和 office_name 是复合唯一键(业务键);business_id 是 BUSINESS 的强制性 FK;

CUBICAL(cubical_ID,office_id,cubical_#)cubical_ID是PK的序列;office_id 和cubical_# 是复合唯一键(业务键);office_id 是 OFFICE 的强制性 FK。

实体 BUSINESS 有许多办公室;每个办公室必须属于一个企业。一个办公室有许多立方;每个 CUBICAL 必须属于一个办公室。


第四个实体 TASK ( task_id , task_descr)可以分配给立方体,也可以分配给办公室内除了应用 TASK 之外对业务没有任何用途的区域,例如走廊、电气室或整个办公室.

对于继承,我看到了两种使用超类型 TASKABLE 执行此操作的方法:要么创建两个子类型,CUBICAL 和 NON CUBICAL,并使用“cubical”或“noncubical”的子类型鉴别器;或创建一个子类型,CUBICAL,子类型区分符为“立方”、“走廊”、“电气室”、“物业宽”等。


TASKABLE ( taskable_id , taskable_type) 其中 taskable_type in ('cubical', 'noncubical')

立方(cubical_ID,office_id,cubical_#,taskable_id)

NONCUBICAL ( noncubical_ID , office_id, descr, taskable_id)其中描述在 ('hallway', 'electric room', 'office wide', 'etc')

任务(task_id,task_descr,taskable_id)

select cubical_#, task_descr from cubical, task where cubical.taskable_id = taskable.taskable_id
union
select non_cubical.descr, task_descr from noncubical, task where noncubical.taskable_id = taskable.taskable_id

TASKABLE ( taskable_id , taskable_type) where *taskable_type in ('cubical', 'hallway', 'electric room', 'office wide', 'etc')*

CUBICAL(cubical_ID、office_id、cubical_#、taskable_id)其中 taskable_id

任务(task_id,taskable_id)

select cubical_#, task_descr from cubical, task where cubical.taskable_id = task.taskable_id
union
select taskable.taskable_type, task.task_descr from taskable, task_descr where taskable.taskable_id = task.task_id
    and taskable.taskable_type NOT LIKE 'cubical'

因为在这种情况下,非立方区域除了分配任务之外没有其他用途,并且没有其他属性,我认为最好使用一个子类型并在 sql 语句的 where 子句上使用附加条件(NOT LIKE 'cubical ')

有 5 个以上的子类型鉴别器但只使用一个子类型实体,这很奇怪吗?

谢谢,--马修·莫伊森

4

0 回答 0