2011-12-17 67 views
0

对于有经验的数据库开发人员,这可能是一个简单的问题,但我很苦恼......我无法将某个ER图翻译为数据库模型, 。具有子类型交叉链接的超类型/子类型db设计

我有类似的设置滑动此呈现的17: http://www.cbe.wwu.edu/misclasses/mis421s04/presentations/supersubtype.ppt

幻灯片17示出了与具有员工类型属性的雇员超型ER图和作为亚型雇员类型本身(每小时,工薪和顾问),这与我的设计情况非常相似。

就我而言,假设薪水员工是唯一可以成为其他员工老板的员工,并且我想以某种方式表明某个薪水员工是否是小时和/或薪水员工和/或顾问的老板,没有或两者),这怎么可能在数据库模型中设计,同时考虑到这些是一对多的关系?

我可以把他们之间的PK-FK关系,这将导致有两个FKeys和(就像FK_Employee和FK_SalariedEmployee顾问)和SalariedEmployee引用本身的所有表中,但我一直在想这也许不是最聪明的解决方案。 ...虽然我不确定为什么(诚信问题?)。

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

在此先感谢您的帮助!

回答

1

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

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

如果您在“泛化专业化关系建模”上搜索网页,您会发现几篇有用的文章,教您如何做到这一点。在这个论坛中,你也会被指出几次这个话题。

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

这在广义数据和专用数据之间建立了双向关联。每个专门的子类的简单视图将一起收集广义和专门的数据。一旦你掌握了它,它很容易,它表现相当好。

在你的具体情况下,宣布“FK的老板”引用薪水员工表中的PK就足够了。这会产生你想要的双向联系,并且还可以防止那些没有工资的雇员被引用为老板。

+0

非常感谢您的回答。我想我知道了,但要检查一下:发电机组(发电机组)的PK id实际上与编程器的某个规格表的PK id是一样的。因此,每个规格表(子类型)将始终具有与单个gen行相关的不同PK ID。这意味着'FK的老板'也可以始终与发型表(超类型)相关联。我理解正确吗? – TomL 2011-12-17 13:44:14

+0

呃...我的意思是当然有另外一种方式......规范表(例如Salaried Employee)的PK id实际上将以编程方式与其中一个gen table(Employee)的PK id相同, 对? – TomL 2011-12-17 14:01:46

+0

是的,还有更多。 “Boss of column”的FK值与Salaried Employees表中一行的PK值相同。反过来,这个PK将与Gene一行中的PK表的值相同。所以你可以根据这个共同的价值加入所有三张表。 – 2011-12-17 16:00:36