所以我在我的数据库中有这两个表:
Companies
--------------------
CompanyID (PK)
Name
Employees
--------------------
EmployeeID (PK)
CompanyID (FK)
Name
基本上,一家公司有很多员工。
但我想让每家公司只有一名员工是主要联系人。我最初的想法是只在MainContactID
表中添加Companies
字段,引用EmployeeID
中的Employees
,但这会创建一个包含关系的循环。
最好的方法是什么?
答案 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)
如果您不想
你可以用这个:
在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)