2017-06-16 121 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