2010-03-01 81 views
1

我正在創建時間表應用程序。我有以下的實體(其中包括):規格化時間表工具的數據庫並確保數據完整性

  • 公司
  • 員工 =與公司相關聯的員工
  • 客戶 =與公司
相關的客戶端

到目前爲止,我有以下(略)數據庫設置:

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表)。

想象一下,爲少數客戶開展項目的員工可以寫入計費時間,但不允許員工爲未由其僱主(公司)分配的客戶編寫計費時間。因此,員工不會自動訪問公司的所有客戶,但只能訪問公司爲他們選擇的客戶。希望這可以讓我們更清楚地瞭解這個問題。

回答

0

如果你想從數據庫級別做到這一點,那麼我會把邏輯放在存儲過程中。如果適用,存儲的proc代碼會將兩者關聯起來,但這意味着(假設您將外鍵放在客戶表中的員工中),客戶端僅與一名員工關聯。這是你想要的嗎?

還要注意,儘管表中的一名員工通過其公司關聯與所有此類客戶間接關聯。如果所有員工都自動與他們公司的所有新客戶關聯,那麼您可能只想編寫一個查詢來檢查這一點。

+0

嗨Hannes,謝謝你的迴應。 「(假設你把外鍵放在客戶表中的員工)」。我推測你認爲EmployeeClient表(m到n)?如果是這樣,那麼是的,員工將與其公司的客戶單獨關聯。所以,對於第二個觀察:員工不會自動鏈接到公司客戶,這就是爲什麼我需要這個工作。我希望一些員工與他們在m到n表中工作的公司的某些客戶有聯繫。那麼,在那種情況下,SP似乎是唯一可行的選擇,對嗎? – 2010-03-01 14:59:11

+0

其實我的意思是在你的Client表中有一個employeeId,但是如果你想要多對多的關係,那麼是的有關聯的EmployeeClient表,並有一個名爲associateClientWithEmployee的存儲過程,可以爲你做你的邏輯。 – 2010-03-01 15:11:05

+0

我剛剛閱讀了您的問題的最後一段:「因此,當我爲員工插入客戶端以及員工的公司ID時,數據庫應該在客戶端與員工的公司ID沒有關聯時防止這種情況發生。」我現在更多地在同一頁面上:爲此,我將把檢查觸發器的邏輯。如果檢查失敗,則拋出異常。順便說一句,這是什麼DB? – 2010-03-01 15:13:01

0

(這是不是一個答案,但它並沒有真正適合於作爲一個問題提出評論)

呈現的數據爲您的設計問題,繞過了一些問題:

  • 是員工與公司客戶關聯?或...
  • 員工是否只與客戶有關聯,並且(因此)與該客戶有關聯的公司?
  • 如果employess和客戶與公司有關聯,是否是與該公司所有員工關聯的員工,還是必須選擇?

更新

至於數據建模而言,這似乎是所有你需要做的是擴大EmployeeClient的外鍵員工像這樣:

EmployeeClient 
- companyId 
- employeeId 
- clientId 

複合主關鍵在所有三列。在(companyId,的clientId)

外鍵的客戶
上(companyId,僱員) 外鍵員工

因此,在EmployeeClient定義的所有關係,需要客戶和員工共享同一個客戶端。

+0

嗨菲利普,謝謝你的迴應。請參閱我更新的問題以獲得進一步解釋。 – 2010-03-01 15:47:11

相關問題