2012-10-06 169 views
3

我有一個MySQL數據庫6張桌子,我需要彼此連接(6個項目必須在任何可能的方式有關)。我還需要爲這些關係添加一個「sort_order」列。 使用「古典ManyToMany」連接表會導致一個混亂的數據庫,有數十個連接表。這是不可能維持的。 我能找到的最佳解決方案是使用7列的單個連接表(6個項目id + 1用於sort_order),其中每行標識2個表之間的單個關聯。最佳MySQL數據庫設計多多對多關係

這裏是連接表我做:

mysql> desc relations; 
+------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+------------+---------+------+-----+---------+-------+ 
| artist_id | int(11) | YES | MUL | NULL |  | 
| art_id  | int(11) | YES | MUL | NULL |  | 
| edition_id | int(11) | YES | MUL | NULL |  | 
| expo_id | int(11) | YES | MUL | NULL |  | 
| news_id | int(11) | YES | MUL | NULL |  | 
| press_id | int(11) | YES | MUL | NULL |  | 
| sort_order | int(11) | YES |  | NULL |  | 
+------------+---------+------+-----+---------+-------+ 
7 rows in set (0,00 sec) 

因爲我不是數據庫設計的專家,我想可能有更好的設計來達到同樣的目的。什麼是最好的設計?注意1:請不要告訴我,我應該避免太多的關聯:這是項目的一個特別的和確切的需求,我只需要找到最好的解決方案使之成爲可能。注意2:順便說一下,這是一個Php/MySql Web應用程序,我使用Yii作爲框架。

+1

下一次請從您的終端複製/粘貼到問題中。突出顯示和ctl-k格式化代碼塊。 –

+0

完成。剛剛編輯... – taseenb

回答

2
  1. 如果在性能和維護方面正確完成連接(例如標準化),連接並不差。
  2. 只有在需求實際發生時纔會解除標準化。
  3. 按照最可能正確(和工作!)的路徑開始,不要擔心表現或其他事情。
  4. 過早優化據說是萬惡之母。
  5. 添加合適的索引外鍵(MySQL的自動涵蓋了這一點),並於在WHERE使用的字段,ONORDER BY
+0

感謝您的答案。其實我不在乎這個階段的演出太多。如果這種設計在性能方面比30個連接表格更好或者沒有,我不知道。任何想法呢? – taseenb

+0

@ e.a。你需要什麼樣的查詢才能加入30個表格?除非對關係/外鍵的使用存在誤解,否則您的表名看起來非常清晰,不需要太多連接。您能舉出推理的例子嗎? –

+0

我有6個表格:每個表格有5個關係。這意味着30個連接表與1個(我發佈的例子)。 – taseenb

2

請不要做你提出什麼。你是對的:如果你的實體之間有很多多對多的關係,你將會有很多連接表。但這是一個比你提出的更好的解決方案。認真。

它會更好,因爲在連接表中不會有任何空的id值,這意味着您將獲得索引的全部好處。

您的實體關係將更容易更新和排除故障。

無論誰維護你的代碼後,你轉移到別的東西不會詛咒你的名字。換句話說,您將使用傳統的dbms設計技術來解決傳統問題,並且您的設計將是透明的。

有很多架構設計工具可以幫助您爲所有這些連接表生成DDL。提示:確保您的ID列在整個過程中統一命名。也就是說,在藝術家表格中以及在artist_art表格和artist_edition表格中將其稱爲artist_id。如果你這樣做,模式設計工具可以自動理清你在做什麼。

+0

謝謝。您確認除了「傳統」之外,沒有其他方法可以實現這一目標。但我仍然有些疑惑。如果我沒有出錯,我會有30個連接表。 30 vs 1仍然會更好地維護另一個開發者?如果我需要添加一個新項目怎麼辦?我應該在設計中增加7個表格。考慮到管理這些關係的代碼可能會在一個類中使用一些方法,也許靜態方法很容易使用和重用。我想知道在這種情況下規則比邏輯更重要,當你有這樣的特殊需求時。 – taseenb