2017-06-16 119 views
1

我有以下情况:
- 客户端(ID)
- 合同(ID,客户端ID)
- ClientEmployee(ID,客户端Id)如何在关系数据库中建模这个关系?

客户可以有很多合约,并且客户端可以有许多ClientEmployees。

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

目前,我的解决方案非常简单,我可以在合同和客户雇员之间建立多对多的关系 。
- ContractClientEmployee(ID,ContractID,ClientEmployeeID)

采用这种设计,也没办法(在数据库设计的水平),以防止被关联到另一个客户端的合同ClientEmployee,那将是一个错误的课程。

我觉得必须有一个“好”的解决方案,即在架构上进一步约束捕捉,但我无法弄清楚如何... :-(

更新:我收到两个有效和非常好的我接受了伦佐的一个,因为它是第一个......对不起,重申...

+0

查看我的回答[如何确保不相关表之间的完整性](https://stackoverflow.com/questions/43413488/how-do-i-ensure-integrity-between-unrelated-tables/43416765#43416765) – reaanb

+0

哇......看起来很复杂! :-)我需要时间阅读它......目前,非常感谢!我会告诉你我的想法! – Andrea

回答

0

这里是一个可能的解决方案,其中的基本思想是为合同和员工定义主键,由客户主键组成的组合键和用于区分客户内部不同合同和员工的数字值。

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这必将是雇员对相同的客户该合约是工作规定。

+0

这看起来很有趣!我必须考虑这样一个解决方案的含义,但你已经非常有用,给了我很多想法......谢谢,目前,一旦我理解了所有内容,我都会回复我的评论。细微之处...... ;-) – Andrea

0

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

如果上面这句话意味着合同和ClientEmployees之间的一个一对多的关系,在ClientEmployee可以使用ContractID,而不是客户端ID:在这种情况下

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

可以定义ClientEmployee只有当是客户的合同。

让我现在,如果它适用于您的情况或不。

+0

不,因为客户雇员必须是特定的客户,并且不能在与客户没有关联的合同中工作...... – Andrea