最佳MySql数据库设计,用于多个多对多关系

时间:2012-10-06 14:13:49

标签: php mysql relational-database

我在MySql数据库中有6个表需要彼此连接(这6个项必须以 任何 的方式关联)。我还需要以某种方式为这些关系添加“sort_order”列。 使用“经典的ManyToMany”连接表会导致数据混乱,数十个连接表。这是不可能维持的。 我能找到的最佳解决方案是使用一个包含7列的单个连接表(6个项ID为6个,sort_order为1个),其中每一行标识2个表之间的单个关联。

这是我做的联接表:

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作为框架。

2 个答案:

答案 0 :(得分:2)

  1. 如果在性能和维护方面做得正确(例如规范化),联接也不错。
  2. 只在需要实际出现时才进行去标准化。
  3. 在开头跟随最可能正确(并且正常工作!)的路径,不要担心性能或其他问题。
  4. 过早优化被认为是万恶之母。
  5. 为外键添加适当的索引(MySQL自动覆盖此内容)以及WHEREONORDER BY等中使用的字段。

答案 1 :(得分:2)

请不要做你的建议。你是对的:如果你的实体之间有很多多对多的关系,你会有很多连接表。但这比你建议的解决方案要好得多。认真。

它会表现得更好,因为你的连接表中没有任何空id值,这意味着你将获得索引的全部好处。

您的实体关系将更容易更新和排除故障。

在您转移到其他内容之后维护代码的人不会诅咒您的名字。换句话说,您将使用传统的dbms设计技术来解决传统问题,并且您的设计将是透明的。

有许多架构设计工具可以帮助您为所有这些连接表生成DDL。提示:确保您的id列在整个过程中均匀命名。也就是说,在艺术家表格中,在artist_art表格和artist_edition表格中将其命名为artist_id。如果这样做,架构设计工具可以自动整理你正在做的事情。