【问题标题】:Supertype/subtype db design with subtype cross-link具有子类型交叉链接的超类型/子类型数据库设计
【发布时间】:2012-01-22 14:03:46
【问题描述】:

对于有经验的数据库开发人员来说,这可能是一个简单的问题,但我正在苦苦挣扎......我无法将某个 ER 图转换为数据库模型,感谢任何帮助。

我有一个类似于此演示文稿的幻灯片 17 的设置: http://www.cbe.wwu.edu/misclasses/mis421s04/presentations/supersubtype.ppt

幻灯片 17 显示了一个 ER 图,其中 Employee 超类型具有 Employee Type 属性,而 Employee 类型本身(Hourly、Salried 和 Consultant)作为子类型,这与我的设计情况非常相似。

在我的情况下,假设受薪员工是唯一可以成为其他员工老板的人,我想以某种方式表明某个受薪员工是否是小时工和/或受薪员工和/或顾问的老板(或者,没有或两者都有),如何在数据库模型中设计,同时考虑到这些是一对多的关系?

我可以在它们之间建立 PK-FK 关系,这将导致所有表都有两个 FKey 并且(比如顾问有 FK_Employee 和 FK_SalariedEmployee)和 SalriedEmployee 引用自己,但我一直认为这可能不是最明智的解决方案。 ..虽然我不确定为什么(完整性问题?)。

这是一个可接受的解决方案还是有更好的解决方案?

提前感谢您的帮助!

【问题讨论】:

    标签: database database-design entity-relationship


    【解决方案1】:

    您的案例看起来像是被称为“泛化专业化”(简称 Gen-Spec)的设计模式的一个实例。面向对象的程序员很熟悉 gen-spec 模式。在教授继承和子类时,它会在教程中介绍。

    实现 gen-spec 模式的 SQL 表的设计可能有点棘手。数据库设计教程经常掩盖这个主题。但它在实践中一次又一次地出现。

    如果您在网络上搜索“泛化专业化关系建模”,您会发现几篇有用的文章教您如何做到这一点。您还会在此论坛中多次提及此主题。

    这些文章通常向您展示如何设计一个表来捕获所有通用数据,并为每个子类设计一个专用表,其中包含该子类特定的所有数据。有趣的部分涉及子类表的主键。您不会使用 DBMS 的自动编号功能来填充子类主键。相反,您将对应用程序进行编程,以将从通用表获得的主键值传播到适当的子类表。

    这会在通用数据和专用数据之间创建双向关联。每个专用子类的简单视图将一起收集通用数据和专用数据。一旦掌握了它就很容易,而且性能相当不错。

    在您的具体情况下,声明 FK 的“老板”以引用 Salied Employees 表中的 PK 就足够了。这将产生您想要的双向关联,并防止没有薪水的员工被称为老板。

    【讨论】:

    • 非常感谢您的回答。我想我明白了,但要确定:gen 表(Employee)的 PK id 实际上会以编程方式与 spec 表之一的 PK id 相同?因此,每个规格表(子类型)总是具有与单个 gen 行相关的不同 PK id。这意味着 FK 的“boss”也可以始终与 gen 表(超类型)相关。我理解正确吗?
    • 嗯...我的意思当然是相反...规格表(例如受薪员工)的 PK id 实际上与其中一个的 PK id 相同以编程方式生成表(员工),对吗?
    • 是的,还有更多。 “列的老板”的 FK 将与 Salied Employees 表中一行的 PK 值相同。该 PK 又将与 gen Employees 表的一行中的 PK 值相同。因此,您可以根据这个共同值连接所有三个表。
    • 太棒了!非常感谢!这完美地解决了我正在解决的问题。
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2011-07-24
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多