[主要编辑:感谢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