在具有现有一对多关系的表之间创建一对一关系

时间:2012-03-19 18:45:19

标签: sql sql-server database database-design relational-database

所以我在我的数据库中有这两个表:

Companies
--------------------
CompanyID (PK)
Name


Employees
--------------------
EmployeeID (PK)
CompanyID (FK)
Name

基本上,一家公司有很多员工。

但我想让每家公司只有一名员工是主要联系人。我最初的想法是只在MainContactID表中添加Companies字段,引用EmployeeID中的Employees,但这会创建一个包含关系的循环。

最好的方法是什么?

5 个答案:

答案 0 :(得分:2)

你最初的想法没有(在我看来)是错误的。

虽然你提出了循环,但这里没有问题。

companies.MainContactEmployeeID确保每家公司只有一个这样的联系人。

然后,添加 Companies(CompanyID,MainContactEmployeeID)的外键:Employees(CompanyID,EmployeeID) 可确保员工真正为该公司工作。 (也需要在Employee表上匹配唯一索引)。

只有'循环'才能使用这样的外键。这肯定不是问题。

答案 1 :(得分:2)

我们通过地址,电子邮件和电话做类似的事情。我们有一个字段将记录标记为主要记录。然后通过触发器维护该字段,以便如果主要联系点发生更改,您仍然只有一个,如果主要联系人被删除,则触发器使用业务规则来确定哪个剩余记录将获得该标志,因为我们必须如果我们有任何记录,至少有一个主记录。

答案 2 :(得分:1)

我个人更喜欢这个型号:

Organization
-------------
organization_id
name
other_columns

Person
-------------
person_id
name
other_columns

Person_Organization
--------------------
person_id
organization_id
begin_date
end_date
relationship_cd

这允许人们一次为多个组织工作(当然可能)并且允许您在关系定义上非常灵活 - 所以此人此时与此组织有关的“怎么样”...(对承包商等很重要。)

答案 3 :(得分:1)

如果您不想

  • FK关系中的循环路径
  • FK栏中的空缺

你可以用这个:

UNIQUE中添加Employee(CompanyID, EmployeeID)约束并制作另一个表格:

Company_MainContact
--------------------
CompanyID  (PK) (FK1-->Employee)
EmployeeID      (FK1-->Employee)

答案 4 :(得分:0)

创建一个包含组合主键的表,如下所示:

Company_MainContact
--------------------
EmployeeID (PK) (FK-->Employee)
CompanyID (PK)  (FK-->Company)