2012-03-19 107 views
2

所以,我在我的数据库这两个表:创建表之间有一个一对一的关系与现有的一对多关系

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


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

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

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

这样做的最好方法是什么?

回答

2

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

虽然有一个循环如你所说,这里没有问题。

拥有companies.MainContactEmployeeID可确保每家公司只有一个此类联系人。

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

这样的外键只有因'循环'才有可能。这当然不是问题。

+0

这将创建一个循环引用的情况,员工已经是公司的孩子,它不能也是父母,否则你将无法插入记录。 – HLGEM 2012-03-19 19:06:07

+2

@HLGEM - 我不同意,这是我用过的一种模式,它确实有效。 '1.'创建没有MainContact的公司(NULL FK)。 '''为该公司创建小孩雇员。 '3.'将公司的主要联系人更新为您创建的其中一名员工。 – MatBailie 2012-03-19 19:53:03

0

创建表的组合主键,就像这样:

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

虽然这确实有用,并且有其自身的优点,但我认为OP对于为什么会对建议的选项感兴趣。你有没有理由这样做,当它总是1:1? – MatBailie 2012-03-19 18:55:35

+0

假设数据库已经被填充,并且“工作”并且这个主要联系人标识符是一个新的需求,这可能是最快和最简单的解决方案,而不需要1)重构数据模型,或者2)丑陋的黑客相关触发器等。 – Chad 2012-03-19 19:16:04

+0

此解决方案不是100%正确的。通过这种方式,公司的主要联系人可以是为另一家公司工作的人员。 – 2012-03-20 08:17:22

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 

这使人们能够在一个时间超过一个组织工作(当然可能),并允许你在关系定义上非常灵活 - 所以这个人在这个时候与这个组织有什么关系......(对承包商来说很重要)

+0

您如何执行“最多1名员工作为主要联系人”? – MatBailie 2012-03-19 18:54:18

+1

可能有几种方法 - 您可以对Person_Organization采用约束或插入/更新触发器来强制执行“Max 1 Employee”。我认为用这种方式强制执行这个过程是非常容易的,而不是直接把它烧成表格结构。 – 2012-03-19 19:07:02

2

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

1

如果你不希望有

  • 圆形路径在FK关系
  • 空值的FK列

您可以使用此:

添加UNIQUE限制在Employee(CompanyID, EmployeeID)并制作另一个表格:

Company_MainContact 
-------------------- 
CompanyID (PK) (FK1-->Employee) 
EmployeeID  (FK1-->Employee) 
相关问题