2017-09-13 41 views
0

考慮一個簡單的情況,其中有兩個表,名爲Users和WorkGroups。外鍵循環引用困境

  1. 用戶的電子郵件地址是用戶表中的主鍵。
  2. Workgroup_id是WorkGroup表中的主鍵。
  3. 用戶可以創建多個工作組。
  4. 用戶可以只是1個工作組的一部分。

在這種情況下,我需要跟蹤哪個用戶創建了一個工作組。

我已經這樣做:

  1. 已經在用戶表命名workgroup_id變量來了解用戶所屬的工作組。這是Workgroup表中workgroup_id的外鍵。
  2. 在工作組表中有一個名爲user_email的變量來跟蹤哪個用戶創建了工作組。這是用戶表中user_email的外鍵。

,我現在面臨這裏的問題是,這導致用戶和工作組表之間的循環引用。由於循環引用在編程中的任何地方都是不可能的。

我該如何解決這個問題?有沒有更好的設計模式,我在這裏失蹤?

編輯: 至於是否「循環引用是一個很大的不,不」與否,在概念上,他們可能不會,但由於實現在不同的數據庫中不普遍,但仍然是一個有效的問題。當您使用ORM時,情況更加嚴重,您的數據庫的ORM支持限制了您可以使用的數據庫設計類型。

+0

我不明白這是如何循環的。創建工作組的用戶和工作組中的用戶不相關。您可能想要查看識別與非識別關係:https://stackoverflow.com/questions/762937/whats-the-difference-between-identifying-and-non-identifying-relationships – dragmosh

+1

@dragmosh雖然它不循環這樣,仍然存在雞與雞蛋的問題。他無法創建第一個工作組,因爲它需要創建者電子郵件。而且他不能創建第一個用戶,因爲它需要一個工作組ID。 – Barmar

+0

雖然它可能不會在這樣的設計問題上產生太大的差異,但您可能不希望將它與'mysql'和'sql server'一起標記,因爲它們不是同一個產品。 – Xedni

回答

2

您需要至少允許一個外鍵爲NULL。這將允許您在該表中創建第一行,並將外鍵作爲佔位符留空。在另一個表上創建相應的行後,您將更新第一行中的外鍵。

您也可以決定這是永久的條件。如果您在創建任何用戶之前自動創建第一個工作組,那麼第一個工作組並沒有真正的創建者,因此您可以將其設置爲NULL

+0

謝謝Barmar,這實際上是一個很好的解決方案。但是,對於行(而不是列)中的外鍵(僅在問題的上下文中),您如何看待外鍵?在這種情況下,創建工作組的用戶將始終存在於工作組本身之前。添加和刪​​除工作組不會成爲問題。那麼結構是否仍然處於循環參考狀態? –

+0

然後,可空列應該是'users.workgroup',因爲第一個用戶必須在他所屬的工作組之前創建。 – Barmar