2012-10-16 75 views
3

在我的數據庫單獨或共同關係的表我有一個像todoseventsdiscussions
他們每個人都可以有tagscommentsfiles,以及其他相關的項目不同的實體。MySQL的:不同實體

現在我要設計這些表之間的關係,我想我有以下兩種可能的解決方案可供選擇:

1.分居關係表

所以我將創建todos_tagsevents_tags,discussions_tags,todos_comments,events_comments,discussions_comments等表。

2.常見關係的表

我將創建僅這些表中:related_tagsrelated_commentsrelated_files等。具有這樣的結構:

related_tags

  • entity (事件|討論| todo |等 - 作爲枚舉或tinyint(1 | 2 | 3 |等))
  • entity_id
  • tag_id

我應該使用哪種設計?

也許你會說:這取決於情況,我認爲這是正確的。我需要查詢其中一個實體(事件,討論或待辦事項),但在某些情況下,我需要它們都在同一個查詢中(兩個事件,討論,例如具有指定標籤的待辦事項)。在這種情況下,如果我使用分離關係表,我必須在3+桌上進行聯合(在我的情況下,它可以是5+桌)。

我不會在每個表中有超過1000-2000行(事件,討論,todos);

什麼是正確的路要走?對此有什麼個人經驗?

回答

2

第二個模式更具擴展性。這樣您就可以擴展您的應用程序來構建涉及多種類型的查詢。另外,即使動態地增加新的類型也是可能的。此外,它允許更大的聚合自由度,例如允許您計算每種類型中有多少行,或者在特定時間段內創建了多少行。另一方面,除了速度之外,第一種設計並沒有很多優勢:但MySQL已經很好地爲您處理這些類型的查詢。您可以創建索引「實體」以使其順利運行。如果將來你需要劃分你的桌子來提高速度,你可以在稍後階段這樣做。

2

這是一個非常簡單的設計,有一個單一的常見關係表,如related_tags,您可以在列中指定實體類型而不是具有多個表。只要確保您正確地將實體和tag_id字段編入索引以獲得最佳性能即可。