【问题标题】:How to model this relation in a relational database?如何在关系数据库中建模这种关系?
【发布时间】:2017-06-18 15:04:05
【问题描述】:

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

一个客户可以有很多合同,一个客户可以有很多 ClientEmployees。

对于任何合同,我都需要关联处理它的 ClientEmployees。

目前,我的解决方案很简单,我在其中构建了一个多对多 合同与客户雇员之间的关系。
- ContractClientEmployee(ID、ContractID、ClientEmployeeID)

使用这种设计,没有办法(在数据库设计级别)防止 ClientEmployee 与另一个客户的合同相关联,这当然是一个错误。

我觉得必须有一个“更好”的解决方案,在架构中捕获这个进一步的约束,但我不知道如何...... :-(

更新:我收到了两个有效且非常好的答案,这一点或多或少是针对相同概念的一个好的解决方案。我接受了 Renzo 的,因为它是第一位的……对不起,reaanb……

【问题讨论】:

标签: database-design relational-database


【解决方案1】:

这是一个可能的解决方案,其基本思想是为 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 插入一条新记录时,这肯定是为同一个客户工作的雇员,合同规定为同一客户。

【讨论】:

  • 这看起来很有趣!我必须考虑这种解决方案的含义,但是您已经非常有用了,给了我很多思考...谢谢,就目前而言,一旦我完全理解了它,我将带着我的 cmets 回来细微差别... ;-)
【解决方案2】:

对于任何合同,我都需要关联处理它的 ClientEmployees。

如果上面的句子表示 Contract 和 ClientEmployees 之间的一对多关系,在 ClientEmployee 中你可以使用 ContractID 代替 ClientID:

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

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

现在让我看看它是否适合您的情况。

【讨论】:

  • 不,因为客户雇员必须是特定客户的,并且不能在与客户无关的合同中工作......
猜你喜欢
  • 2010-11-12
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多