超类型/子类型继承(子类型鉴别符的数量是否应该等于子类型实体的数量?)

时间:2013-01-21 00:42:37

标签: database-design normalization entity-relationship database-normalization entity-relationship-model

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

业务( business_id

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

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

实体业务有很多OFFICE;每个OFFICE必须属于一个BUSINESS。 OFFICE有许多CUBICALs;每个CUBICAL必须属于一个OFFICE。


第四个实体,TASK( task_id ,task_descr),可以分配给立方体,但也可以分配给办公室内的区域,除了将TASK应用于它们之外,这些区域对业务没有任何作用,例如走廊,电动室或整个办公室。

使用继承,我看到使用超类型TASKABLE执行此操作的两种方法:创建两个子类型,CUBICAL和NON CUBICAL,子类型鉴别符为“cubical”或“noncubical”;或创建一个子类型CUBICAL,子类型鉴别器为“cubical”,“hallway”,“electric room”,“property property”等。


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

CUBICAL( cubical_ID ,office_id,cubical_#,taskable_id)

NONCUBICAL( noncubical_ID ,office_id,descr,taskable_id)其中描述('走廊','电气室','办公室宽','等') < / p>

任务( 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)其中* 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像'立方体')

拥有5个以上的子类型鉴别器但仅使用单个子类型实体是否很奇怪?

谢谢你, --Matthew Moisen

0 个答案:

没有答案