簡體   English   中英

如何在關系數據庫中的一對多關系上定義一對一關系?

[英]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視圖,並可以確保獲得一些結果(*)。

(*)如果用戶完全有收藏,那就是。 請注意,需要默認集合並要求該集合存在,意味着每個用戶至少需要一個集合。 (這的必然結果是,如果必須允許用戶根本沒有任何收藏,那么要求他擁有默認收藏是不明智的和矛盾的。)

我認為最可行的解決方案是:

  1. 將可為空的“默認”字段添加到“集合”表
  2. 為used_id和default創建UNIQUE約束

在“默認”列中保留“ true” -s和NULL(無false)。

這將不允許與同一user_id關聯的多個Collection具有相同的“默認”值,而不是null。 您無需開發任何應用程序邏輯。 但是,這種設計不會強迫您始終為用戶保留默認集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM