我正在創建時間表應用程序。我有以下的實體(其中包括):規格化時間表工具的數據庫並確保數據完整性
- 公司
- 員工 =與公司相關聯的員工
- 客戶 =與公司
到目前爲止,我有以下(略)數據庫設置:
Company
- id
- name
Employee
- id
- companyId (FK to Company.id)
- name
Client
- id
- companyId (FK to Company.id)
- name
現在,我希望員工與客戶關聯,但只有只有如果該客戶與員工工作的公司關聯。您如何保證數據庫級別的數據完整性?還是應該僅僅依靠應用程序來保證數據的完整性?
我想到了創建一個多對多的表是這樣的:
EmployeeClient
- employeeId (FK to Employee.id)
- companyId \ (combined FK to Client.companyId, Client.id)
- clientId /
因此,當我與員工的公司ID一起插入一個客戶端的僱員,數據庫應防止這種情況時,客戶端不與員工的公司ID相關聯。這有意義嗎?因爲這仍然不能保證員工與公司有關聯。你如何處理這些事情?
UPDATE
該方案是如下:
- 公司有多個員工。員工只會與一家公司掛鉤。
公司也有多個客戶。客戶只能鏈接到一家公司。
(公司是一個沙箱,可以這麼說)。
公司的員工可以鏈接到公司的客戶,但前提是客戶是公司客戶的一部分。
換句話說:
應用程序將允許公司創建/加入的員工,並創建/添加客戶端(因此companyId FK在員工和客戶端表)。接下來,公司將被允許將某些客戶分配給它的某些員工(EmployeeClient表)。
想象一下,爲少數客戶開展項目的員工可以寫入計費時間,但不允許員工爲未由其僱主(公司)分配的客戶編寫計費時間。因此,員工不會自動訪問公司的所有客戶,但只能訪問公司爲他們選擇的客戶。希望這可以讓我們更清楚地瞭解這個問題。
嗨Hannes,謝謝你的迴應。 「(假設你把外鍵放在客戶表中的員工)」。我推測你認爲EmployeeClient表(m到n)?如果是這樣,那麼是的,員工將與其公司的客戶單獨關聯。所以,對於第二個觀察:員工不會自動鏈接到公司客戶,這就是爲什麼我需要這個工作。我希望一些員工與他們在m到n表中工作的公司的某些客戶有聯繫。那麼,在那種情況下,SP似乎是唯一可行的選擇,對嗎? – 2010-03-01 14:59:11
其實我的意思是在你的Client表中有一個employeeId,但是如果你想要多對多的關係,那麼是的有關聯的EmployeeClient表,並有一個名爲associateClientWithEmployee的存儲過程,可以爲你做你的邏輯。 – 2010-03-01 15:11:05
我剛剛閱讀了您的問題的最後一段:「因此,當我爲員工插入客戶端以及員工的公司ID時,數據庫應該在客戶端與員工的公司ID沒有關聯時防止這種情況發生。」我現在更多地在同一頁面上:爲此,我將把檢查觸發器的邏輯。如果檢查失敗,則拋出異常。順便說一句,這是什麼DB? – 2010-03-01 15:13:01