如何在关系数据库中建模这种关系?

时间:2017-06-16 15:42:47

标签: database-design relational-database

我有以下情况:
- 客户(ID)
- 合同(ID,ClientID)
- ClientEmployee(ID,ClientId)

客户可以拥有多个合同,客户可以拥有许多ClientEmployees。

对于任何合同,我需要关联在其上工作的ClientEmployees。

目前,我的解决方案很简单,我建立了多对多的解决方案 合同与客户雇员之间的关系 - ContractClientEmployee(ID,ContractID,ClientEmployeeID)

使用此设计,无法(在数据库设计级别)阻止ClientEmployee与另一个客户的合同关联,当然这将是一个错误。

我觉得必须有一个更好的'解决方案,在模式中捕获这个进一步的约束,但我无法弄清楚如何... :-(

更新:我收到了两个有效且非常好的答案,或多或少,对于一个好的解决方案的相同概念。我接受了Renzo的一个,因为它是第一个......抱歉,reaanb ......

2 个答案:

答案 0 :(得分:0)

这是一个可能的解决方案,其基本思想是将Contract和Employee的主键定义为由客户主键形成的复合键,以及用于区分不同合同和员工的数值“在里面”是一个客户。

Client(ClientId, ClientData),
   primary key ClientId
Contract(ClientId, ContrNum, ContractData)
   primary key (ClientId, ContrNum)
   ClientId foreign key for Client
Employee(ClientId, EmplNum, EmplData)
   primary key (ClientId, EmpNum)
   ClientId foreign key for Client
EmployeeContract(ClientId, EmpNum, ContrNum)
   primary key (ClientId, EmpNum, ContrNum)
   (ClientId, EmpNum) foreign key for Employee
   (ClientId, ContrNum) foreign key for Contract

通过这种方式,数据之间的一致性通过不同的外键在数据库级别维护:当您为EmployeeContract插入新记录时,这肯定是为同一客户工作的雇员,其中规定了合同。 / p>

答案 1 :(得分:0)

  

对于任何合同,我需要关联在其上工作的ClientEmployees。

如果上述句子表示Contract和ClientEmployees之间的一对多关系,则在ClientEmployee中您可以使用ContractID而不是ClientID:

- Client (ID)
- Contract (ID, ClientID)
- ClientEmployee (ID, ContractID)

在这种情况下,只有在客户端有合同时才能定义ClientEmployee。

现在让我告诉您是否适用于您的情况。