簡體   English   中英

同一兩張表上的多對一和一對一關系?

[英]Many-to-One and One-to-One Relationships on Same Two Tables?

我正在設計一個數據庫,其中兩個字段具有多對一關系,但我也需要它們之間的一對一關系,並且我想就是否有比什么更好的方法提出一些建議我現在有。

我的表是accountsusers 一個帳戶可以有多個用戶,但每個帳戶只能且必須有一個所有者。 一個用戶只能與一個帳戶相關聯。

我在users表中有一個account字段,其中存儲了與用戶相關的帳戶的 ID。 accounts表中,我有一個owner字段,它存儲擁有該帳戶的用戶(即主管管理員)的 ID。

我正在使用 InnoDB,所以我可以使用外鍵。 問題是我不能在沒有先創建另一個帳戶或用戶的情況下創建一個帳戶或用戶(由於外鍵的限制),所以我將owner設為可為空。 現在我可以創建一個擁有 null owner的帳戶,然后創建用戶,最后將帳戶的owner設置為用戶。

這是可以接受的,有沒有更好的方法?

以下是我想出的其他一些可能的方法,以及我對每種方法的想法:

  1. users表中有一個 boolean owner字段。 由於每個帳戶只能有一個所有者,因此這種方式似乎不太理想,因為我必須確保每個帳戶只有一個用戶的屬性設置為true

  2. 有第三個表稱為owners 這似乎更多的開銷和更多的工作沒有充分的理由,因為它實際上與在users表中擁有一個owner字段相同。

我現在如何擁有它對我來說最有意義,但是在我創建用戶之前必須設置 null 所有者,然后在事后回來設置它有點尷尬。

我很感激你能給我的任何意見。 謝謝!

這個問題類似,但沒有提到外鍵: 設計表:一對多和一對一?

一般來說,如果您的模式無法按拓撲排序,即如果您無法建立排序,其中表僅引用排序中它之前的表,則通常是一個壞主意。 這種“分層”依賴也是一個非常好的屬性,例如對於軟件模塊(如果兩個模塊相互依賴,就會出現問題)。

在您的情況下,您有引用帳戶的用戶和引用用戶的帳戶,因此無法找到拓撲排序。

在這種情況下,一個標准解決方案是引入一個單獨的表,例如“角色”,其中有三列:用戶、帳戶和角色。 列角色可以是“所有者”或“訪客”。

您知道(給定當前請求)一個帳戶必須有一個且只有一個所有者,或者用戶必須列在一個且只有一個帳戶中的事實並不是真正與“用戶”域相關的 IMO 規則和“賬戶”。

您可以輕松地實施這些規則,但是將數據結構化以使您沒有其他可能性是 IMO 的錯誤。 您應該針對 model 域,而不是特定規則......因為人們會改變他們對這些規則的看法。

你能設想一個有兩個帳戶的用戶嗎? 您可以設想一個擁有多個所有者/管理員的帳戶嗎? 我可以……這意味着很可能很快就會提出請求。 將數據結構化以使您無法表示這一點正在尋找麻煩。

此外,當您在 model 中存在循環依賴關系時,您的查詢將更難編寫。

例如,一個非常常見的情況是嘗試僅使用一個表來表示分層零件列表數據庫,該表具有指向表本身的“父”字段......更好的是有兩個表,零件和組件,其中組件有兩個引用部分和一個數量。

你的解決方案很好。

如果您對所有者列可以為空感到不舒服,您可以依賴一些神奇的用戶記錄(可能 id 為零),這將是“系統用戶”。 因此,新創建的帳戶將歸用戶零所有,直到它們的所有權被適當地重新定義。 無論如何,這似乎比允許帳戶擁有 null 所有者更臭。

在此處輸入圖像描述

當前要求每個用戶只有一個帳戶

alter table UserAccount add constraint un_user_account unique(UserID);

當需求變為多對多時,放棄約束

alter table UserAccount drop constraint un_user_account;

僅對於一個所有者,只需在應用程序級別強制執行即可。

暫無
暫無

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

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