我在MySQL服務器下表:如何跨多個表執行的唯一身份
Companies:
- UID (unique)
- NAME
- other relevant data
Offices:
- UID (unique)
- CompanyID
- ExternalID
- other data
Employees:
- UID (unique)
- OfficeID
- ExternalID
- other data
在他們每個人的UID是唯一標識符,由數據庫創建的。
有外鍵可以確保UID上Employee - > Office - > Company之間的鏈接。
辦公室和員工中的ExternalID字段是公司(我的客戶實際)提供給我的應用程序的ID。客戶沒有(也不關心)我自己的ID,並且我的應用程序從他們收到的所有數據僅根據其ID(即我的表中的ExternalID)標識。
I.e.來自客戶端的僞語言請求就像「我是公司X,更新我的員工Y的數據」。
我需要對CompanyID和Employees.ExternalID的組合強制執行唯一性,所以在我的數據庫中不會有同一公司的員工有重複的ExternalID。
我想約3可能的解決方案:
更改爲員工架構,包括CompanyID,並在這兩個領域創造出獨特的約束。
強制執行觸發器,在Employees中更新/插入時驗證唯一性。
強制對應用程序級別(即我的接收服務)進行檢查。
我的另類dbadmin功能於我的最高審計機關是(3)是最糟糕的解決方案,因爲它不保護不一致的數據庫應用程序錯誤或其他什麼東西的情況下,並極有可能將是最慢一。我可能會想要觸發器解決方案,但它可能會變得複雜,特別是如果需要在單個語句中執行多個插入/更新,並且我不確定性能與(1)的關係。 (1)看起來是最快和最簡單的方法,但有點違揹我對關係模型的理解。
SO DB專家認爲每種方法的優缺點是什麼,特別是如果有可能增加額外的間接層次 - 即公司 - >辦公室 - >部門 - >員工,以及相同的唯一性需要保存(公司/員工)。
@OMG:是的,外鍵是外鍵。爲了簡單起見,我沒有在Q中添加它們。無論如何感謝您發現這一點。我將編輯Q. – 2010-02-18 22:23:00