挑戰:複雜的資料庫結構通常需要一對一的關係。 涉及連結到 Storage
和 Van
表的中央 Warehouse
表的場景說明了這個挑戰。 我們如何有效地建立和維護這些關係,確保資料完整性?
資料庫設計中的繼承策略:
有幾種表示資料庫中繼承的方法:
最優解:類別表繼承與應用程式層級執行
對於Storage
、Van
、Warehouse
場景,首選「類別表繼承」方式。 然而,強制子實體關係的存在性和排他性需要應用程式層級的檢查:
Storage
或 Van
記錄都有一個 Warehouse
記錄。 Storage
記錄僅連結到一個 Van
或一個 Warehouse
記錄,而不是同時連結到兩個。 雖然外鍵約束可以有所幫助,但實現完全排他性可能需要預存程序和應用程式級邏輯來防止客戶端直接進行可能衝突的表更新。 Microsoft SQL Server 缺乏延遲約束,這使得純粹基於約束的解決方案變得複雜。
替代方案:在沒有延遲約束的情況下強制執行排他性
另一種方法透過新增 STORAGE_TYPE
欄位來避免延遲約束:
STORAGE_TYPE
欄位設定為 0。 STORAGE_TYPE
欄位設定為 1。 然後將唯一限制套用於 (STORAGE_ID
, STORAGE_TYPE
) 組合:
<code class="language-sql">CREATE TABLE VAN ( STORAGE_ID int PRIMARY KEY, STORAGE_TYPE AS CAST(0 as tinyint) PERSISTED, FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE) ); CREATE TABLE WAREHOUSE ( STORAGE_ID int PRIMARY KEY, STORAGE_TYPE AS CAST(1 as tinyint) PERSISTED, FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE) );</code>
此方法保證單一 STORAGE_ID
只能與 Van
或 Warehouse
關聯,從而強制執行一對一關係的排他性。 然而,存在仍然需要應用程式層級的驗證。
以上是如何在具有繼承性的資料庫設計中有效地建立和執行一對一關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!