我们如何实施IS-A关系?

时间:2010-12-05 21:39:19

标签: sql database database-design class-table-inheritance

我们通过将一个表的PK作为FK添加到另一个表来实现一对多关系。 我们通过将第2个表的PK添加到第三个表来实现多对多关系。

我们如何实施IS-A关系?

实体是技术人员和行政人员,均为员工。 我可以在表格中使用额外的字段 员工(id,姓名,角色,...... AdminFields ......,...... TechFields ......)

但我想探索IS-A选项。

编辑:我按照Donnie的建议做了,但没有角色领域。

8 个答案:

答案 0 :(得分:24)

我按照Donnie的建议做了,但没有角色字段,因为它使事情变得复杂。这是最终的实施:

<强> DDL:

CREATE TABLE Employee (
ast VARCHAR(20) not null,
firstname VARCHAR(200) not null,
surname VARCHAR(200) not null,
...
PRIMARY KEY(ast)
);

CREATE TABLE Administrative (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
PRIMARY KEY(employee_ast)
);

CREATE TABLE Technical (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
...
PRIMARY KEY(employee_ast)
);

ER图:

ERD

在此模型中,没有通用类型的员工。在这里,员工只能是管理或技术。

答案 1 :(得分:7)

我总是使用role字段和可选关系来完成此操作。

即表EMPLOYEE (id, ...generic fields... , role)

然后,对于每个角色:

ROLE1 (employeeid, ...specific fields...)

这允许您通过单个查询获取一般员工信息,并且需要联接才能获取特定于角色的信息。这个问题的一个(重大的)缺点是如果你需要一个包含所有角色信息的超级报告,你会遇到一堆外连接。

答案 2 :(得分:6)

IS-A关系也称为gen-spec设计模式。 Gen-spec是“泛化专业化”的缩写。

gen-spec的关系建模与gen-spec的对象建模不同,因为关系模型没有内置的继承。

这是一篇很好的文章,展示了如何将gen-spec实现为表的集合。

http://www.javaguicodexample.com/erdrelationalmodelnotes1.html

要特别注意在专用表中设置主键的方式。这就是使这些表格如此简单的原因。

你可以通过googlin“泛化专业化关系建模”找到很多其他文章。

答案 3 :(得分:5)

如果您有一个需要连接到关系后端数据库的OO应用程序,我建议让Martin Fowler Patterns of Enterprise Application Architecture

他的网站上也有一些相关的注释和图表。具体而言,模式Single Table InheritanceClass Table InheritanceConcrete Table Inheritance描述了在数据表中映射IS-A的三种策略。

如果你正在使用Hibernate或JPA,它们支持所有这些的映射,尽管它们有不同的名称。

在这个特定的例子中,我根本不会使用IS-A。

像雇员角色这样的事情更好地建模为HAS-A,如

  1. 你可能想要一个人 有多重角色。
  2. 改变一个人的角色 更容易。

答案 4 :(得分:3)

本文描述了将一般化映射到模式设计的一些策略。

http://www.sztaki.hu/conferences/ADBIS/3-Eder.pdf

摘要的副本:

  

更丰富的数据模型   对象关系数据库打开很多   更多的逻辑设计选择   一个数据库模式增加了   逻辑数据库设计的复杂性   巨大的利益。专注于概括   构建概念模型我们   探索性能影响   各种设计方案   将泛化映射到   对象关系的模式   数据库系统。

答案 5 :(得分:2)

为什么不将它实现为一对一/一表关系?假设您有一个表格,表示一个名为Vehicle的基类,其主键为VehicleID。然后,您可以拥有代表Vehicle的所有子类的任意数量的卫星表,并且这些表还具有VehicleID作为其主键,与Vehicle-&gt; Subclass具有1> 0/1的关系。

或者,如果你想让它变得更简单并且你肯定知道你只会有一些子类并且没有太多改变的机会,你可以用一个表来表示整个结构。鉴别器类型字段。

答案 6 :(得分:1)

大多数ORM使用单个列鉴别器实现IS-A关系,根据特定列中的值选择要实例化的子类。关于您的示例,您可能并不真正意味着角色,因为通常一个人可以填充许多不同类型的角色。角色通常会被建模为 has-a 关系。如果您尝试使用 is-a 关系(或子类化)来实现它,您不可避免地必须做一些更复杂的事情来处理您有一个人填充混合位置的情况 - 即,秘书也是本地IT人员,需要两者的权限或属性。

答案 7 :(得分:1)

这取决于您是构建单层次结构还是多层次结构。这是一个硬编码设计,我相信这就是你想要的。

对于mono(子表有一个父表),其中子IS-A父表,子表中的FK和PK是相同的,并且该键也是父表中的PK。

对于poly(子表有多个父表),其中子IS-A parent-1和子IS-A parent-2,您将拥有一个复合键(意味着多个主键使表记录唯一),其中规则与每个键的单层次结构相同。