ath*_*spk 33 sql database database-design class-table-inheritance
我们通过将一个Table的PK作为FK添加到另一个表来实现一对多关系.我们通过将第2个表的PK添加到第三个表来实现多对多关系.
我们如何实施IS-A关系?
实体是技术人员和行政人员,均为员工.我可以在表EMPLOYEE中使用额外的字段(id,name,surname,role,... AdminFields ...,... TechFields ......)
但我想探索IS-A选项.
编辑:我按照Donnie的建议,但没有角色领域.
ath*_*spk 24
我做了多尼建议,但没有角色领域,因为它使事情变得复杂.这是最终的实施:
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)
);
Run Code Online (Sandbox Code Playgroud)
ER图:
在此模型中,没有通用类型的员工.在这里,员工只能是管理或技术.
我总是用一个role
字段完成这个,然后是可选的关系.
即,表 EMPLOYEE (id, ...generic fields... , role)
然后,对于每个角色:
表 ROLE1 (employeeid, ...specific fields...)
这允许您通过单个查询获取常规员工信息,并且需要联接才能获取特定于角色的信息.对此的一个(大的)缺点是,如果你需要一个包含所有角色信息的超级报告,你会遇到一堆外连接.
IS-A关系也称为gen-spec设计模式.Gen-spec是"泛化专业化"的缩写.
gen-spec的关系建模不同于gen-spec的对象建模,因为关系模型没有内置的继承.
这是一篇很好的文章,展示了如何将gen-spec实现为表的集合.
http://www.javaguicodexample.com/erdrelationalmodelnotes1.html
请特别注意在专用表中设置主键的方式.这就是使这些表格如此简单的原因.
你可以通过googlin"泛化专业化关系建模"找到很多其他文章.
如果您有一个需要连接到关系后端数据库的OO应用程序,我建议您使用Martin Fowler的企业应用程序架构模式.
他的网站上也有一些相关的注释和图表.具体来说,模式单表继承,类表继承和具体表继承描述了在数据表中映射IS-A的三种策略.
如果你正在使用Hibernate或JPA,它们支持所有这些的映射,尽管它们有不同的名称.
在这个特定的例子中,我根本不会使用IS-A.
像雇员角色这样的事情更好地建模为HAS-A,如
归档时间: |
|
查看次数: |
49106 次 |
最近记录: |