2009-07-09 21 views
2

我正在設計一個mySQL DB,我遇到以下問題:將表格鏈接到2個不同鍵的最佳方法是什麼?

說我有一個wall_posts表。牆可以屬於事件或用戶。 因此,wall_posts表必須引用event_iduser_id(外鍵約束)。

建立這種關係的最佳方式是什麼?考慮到我必須始終能夠知道牆壁屬於誰......?

我一直在使用2個表,如event_wall_postsuser_wall_posts考慮這樣一個有一個event_id場,另一個是user_id一個,但我相信一定有什麼比這樣的冗餘解決方法要好得多......

有沒有辦法使用中間表將wall_posts鏈接到event_iduser_id

由於提前,

編輯:好像還沒有一個明確的設計來做到這一點,這兩個方法似乎不錯,所以, 哪一個是如果有大量數據的最快?

是否最好有2個分隔表(因此查詢可能會更快,因爲表中的數據會少兩倍......),還是更好的方法是使用單個wall_posts表引用(然後是用戶和events will have a unique wall_id`)

回答

2

你在說什麼叫做獨家弧線這不是一個好習慣。很難執行參照完整性。從物體的角度來看,你最好使用一種常見的超類型。

可以在幾個方面進行建模:

  1. 叫,說超桌子,牆壁。兩個分別鏈接到用戶和事件的子類型表(user_wall和event_wall)作爲所有者。 wall_posts錶鏈接到超類型表;或
  2. 將兩個實體類型放在一個表中並且有一個類型列。這樣你就不會鏈接到兩個單獨的表。
4

爲什麼它是多餘的?您不會編寫兩次代碼來處理它們,您將使用相同的代碼,只需更改SQL中表的名稱即可。
採取這種方法的另一個原因是,在未來的某個時候,您會發現每個實體需要新的不同的字段。

+0

完全同意 - 沒有理由補習班一切都變成爲幾桌越好,完全有理由在這個實例中的多個表,這樣就可以實現參照完整性。 – MrTelly 2009-07-09 12:39:25

+0

我在想這是多餘的,因爲我得到了兩倍相同的表結構,除了每個不同的FK外...這實際上是我如何對應用程序進行原型創建的,對於兩個表都有一個模型,但是我一直在想有一些錯誤:/ – Sylvain 2009-07-09 23:27:03

1

一個經典的辦法處理這一問題是:

  • 創建一個表名爲wall_container兩者usersevents保持性能通用於usersevents在它
  • 參考wall_container
  • 參考wall_postswall_container

但是,這不是非常有效,並且不保證此wall_container不包含不是userevent的記錄。

SQL在處理多重繼承方面並不是特別好。

0

你的牆和事件有自己的唯一ID ..對嗎?那麼他們不需要另一張桌子。讓wall_post表有一個作爲原點的屬性,它將指向記錄是事件或用戶的記錄。 '

如果牆和事件可能具有相同的ID,則創建一個具有三個屬性來源(主),ID號和類型的表。 ID號碼將是你設置的類型,類型定義了ID代表什麼類型的實體,來源將是一個新的ID,你可能會生成一個新的ID,可能會添加不同的前綴。在同一個ID的情況下,原始表格將非常有助於您將其他東西用於除牆柱以外的其他事物。

2

尋求最簡單的解決方案:將一個event_id和一個user_id列添加到wall_posts表中。使用約束來強制其中一個爲空,另一個不是。

什麼更復雜的氣味像overnormalization我:)

相關問題