[英]How do I define a one-to-one relationship over a one-to-many relationship in a relational database?
我正在使用以下表格創建數據庫架構(抱歉,錯誤的偽代碼):
User
====
user_id, PK
Collection
==========
collection_id, PK
user_id, FK(User->user_id)
Issue
=====
issue_id, PK
collection_id, FK(Collection->collection_id)
從用戶到館藏,還有從館藏到發行,存在一對多的關系。 因此,單個用戶可以維護多個館藏,每個館藏都有很多問題。
問題:我想指定一個“默認”集合,以在用戶首次登錄該應用程序時顯示。 作為記錄,我正在Django框架中進行此操作,但是我對與平台無關的優雅解決方案更感興趣。 當我嘗試在用戶中創建一個作為集合外鍵的列時,它抱怨說集合尚不存在(我想是因為首先創建了用戶)。 我可以向Collection中添加一個“默認”布爾列,並通過我的應用程序強制每個用戶只有一個記錄為“ true”,但這看起來並不雅致。 我還可以有一個單獨的表,例如User_Default_Collection,該表具有user_id作為外鍵,唯一鍵,還有一個collection_id列是Collection的外鍵。 但是我敢肯定,這也小於第三范式。 有什么建議么?
如果您要強制每個用戶必須並且將始終擁有其“默認”集合,則由於包含依賴項中存在明顯的循環,因此您不得不執行延遲約束檢查(如果DBMS允許在FK循環中聲明FK循環)第一名)或應用程序強制的完整性。
如果您可以容忍根本沒有任何默認集合的用戶,則創建一個單獨的表DFT_COLL(userid,dft_coll_id),其中的USERID和FK分別為USER和COLLECTION。
如果在用戶沒有默認集合的情況下給您帶來麻煩,也許仍然可以通過讓系統僅選擇一個(例如,具有最低[或最高] id的那個)並使用UNION視圖實現此問題來解決(因此如果您需要默認值,則可以閱讀UNION視圖,並可以確保獲得一些結果(*)。
(*)如果用戶完全有收藏,那就是。 請注意,需要默認集合並要求該集合存在,意味着每個用戶至少需要一個集合。 (這的必然結果是,如果必須允許用戶根本沒有任何收藏,那么要求他擁有默認收藏是不明智的和矛盾的。)
我認為最可行的解決方案是:
在“默認”列中保留“ true” -s和NULL(無false)。
這將不允許與同一user_id關聯的多個Collection具有相同的“默認”值,而不是null。 您無需開發任何應用程序邏輯。 但是,這種設計不會強迫您始終為用戶保留默認集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.