2012-10-06 133 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