Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 具有子类型交叉链接的超类型/子类型db设计_Database_Database Design_Entity Relationship - Fatal编程技术网

Database 具有子类型交叉链接的超类型/子类型db设计

Database 具有子类型交叉链接的超类型/子类型db设计,database,database-design,entity-relationship,Database,Database Design,Entity Relationship,对于一个有经验的数据库开发人员来说,这可能是一个简单的问题,但我正在努力。。。我在将某个ER图转换为DB模型时遇到困难,非常感谢您的帮助 我有一个类似于本演示幻灯片17的设置: 幻灯片17显示了一个ER图,其中员工超类型具有员工类型属性,员工类型本身作为子类型(小时、工薪和顾问),这与我的设计情况非常相似 在我的例子中,假设受薪员工是唯一可以成为其他员工老板的员工,我想以某种方式指出某个受薪员工是否是小时工和/或受薪员工和/或顾问的老板(或者,没有,或者两者都有),如何在数据库模型中进行设计,

对于一个有经验的数据库开发人员来说,这可能是一个简单的问题,但我正在努力。。。我在将某个ER图转换为DB模型时遇到困难,非常感谢您的帮助

我有一个类似于本演示幻灯片17的设置:

幻灯片17显示了一个ER图,其中员工超类型具有员工类型属性,员工类型本身作为子类型(小时、工薪和顾问),这与我的设计情况非常相似

在我的例子中,假设受薪员工是唯一可以成为其他员工老板的员工,我想以某种方式指出某个受薪员工是否是小时工和/或受薪员工和/或顾问的老板(或者,没有,或者两者都有),如何在数据库模型中进行设计,还考虑到这些是一对多关系吗

我可以在它们之间建立PK-FK关系,这将导致所有表都有两个FKEY和(比如顾问有FKEY Employee和FKEY SALLIEDEEMPLOYEE)以及SALLIEDEEMPLOYEE引用自身,但我一直认为这可能不是最明智的解决方案……尽管我不确定原因(诚信问题?)

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


提前感谢您的帮助

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

实现genspec模式的SQL表的设计可能有点棘手。数据库设计教程通常会忽略这个主题。但它在实践中一再出现

如果你在网上搜索“泛化-专业化-关系建模”,你会发现一些有用的文章教你如何做到这一点。你也会在这个论坛上多次提到这个话题

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

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


在您的特定情况下,声明“boss of”FK以引用受薪员工表中的PK就足够了。这将产生你想要的双向联想,同时也防止非工薪员工被称为老板

非常感谢你的回答。我想我明白了,但为了确保:gen表(Employee)的pkid实际上会以编程方式和spec表之一的pkid相同吗?因此,每个spec表(子类型)始终具有与单个gen行相关的不同PK id。这意味着FK的“boss”也可以始终与gen表(超类型)相关。我理解对了吗?呃。。。我是说另一种方式当然。。。spec表(例如,受薪员工)的PK id实际上会以编程方式和gen表(员工)中的一个PK id相同,对吗?是的,还有更多。“列老板”的FK值与“受薪员工”表中一行的PK值相同。此PK值将与gen Employees表中一行的PK值相同。因此,您可以基于此公共值连接所有三个表。非常好!非常感谢!这完美地解决了我正在处理的问题。