数据库ERD循环查询

时间:2016-10-08 23:57:28

标签: sql database database-design erd

您好,我需要解决以下数据库设计问题。

一个部门聘用了许多工作人员

每个部分都有多个电话号码

每位员工都有自己的内部电话号码。

我创建了三个实体:电话,员工和部门。电话实体将带有电话号码的号码存储为PK。但是,我创建的ERD在三个实体之间有一个循环。任何简单的解决方案,以避免使用电话实体循环?

Phone Loop ERD Image

2 个答案:

答案 0 :(得分:1)

我对ERD循环的理解与您的不同。根据我的理解,ERD循环是指外键引用无休止地循环。在你的情况下,如果Section有对工作人员的FK引用,则会有一个循环。然后部分参考工作人员,工作人员参考电话和电话参考部分,循环。

你还没有这样建模,因为在你的情况下这是不正确的。你已经用另一种方式正确地建模了它,工作人员引用了Section。

所以你真的没有循环。工作人员参考电话和部分,但这些是独立的关系。

那为什么还是个问题?

答案 1 :(得分:0)

您很可能删除电话和部分之间的关​​系。如果每个电话仅由一名工作人员回答,则表示您已解决了问题。根据回答该电话的工作人员,您知道哪个电话属于某个部分。

如果电话可以由多个工作人员回答,那么您需要一个关联表来表示多对多关系。

如果您仍需要为每位员工跟踪主要电话,您可以添加" IsPrimary"标记到关联表以指示特定电话是特定用户的主要电话。在这种情况下,您将希望对关联表具有唯一约束,以便至少为Staff成员引用,以确保Staff成员没有多个主要电话。

您可能还想添加一个唯一约束,以确保电话不能成为多个员工的主要成员。

处理两个电话实体的更新

即使您决定拥有两个电话实体,您也很可能希望确保两个实体的电话号码都是唯一的。您可以通过实现互斥的子类型来实现此目的。可以在此处找到有关如何执行此操作的详细说明:How to Implement Referential Integrity in Subtypes

获得子类型后,您可以使用原始模型。 SectionPhone将是子类型之一,并且将是您目前在您的Phone实体中拥有的子类型。 StaffPhone将是Staff表引用的另一个子类型。