3

我在 MySql 数据库中有 6 个表需要相互连接(这 6 个项目必须以任何可能的方式关联)。我还需要以某种方式为这些关系添加一个“sort_order”列。使用“经典的多对多”连接表会导致数据库混乱,有数十个连接表。那将是不可能维持的。我能找到的最佳解决方案是使用具有 7 列的单个连接表(6 个用于 6 个项目 id + 1 个用于 sort_order),其中每一行标识 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 作为框架。

4

2 回答 2

2

请不要按照你的建议去做。你是对的:如果你的实体之间有很多多对多的关系,你就会有很多连接表。但这比您提出的解决方案要好得多。严重地。

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

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

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

有许多模式设计工具可以帮助您为所有这些连接表生成 DDL。提示:确保您的 id 列在整个过程中统一命名。即,在艺术家表、艺术家表和艺术家版表中将其称为艺术家id。如果您这样做,架构设计工具可以自动整理出您正在做的事情。

于 2012-10-06T15:00:23.550 回答
2
  1. 如果在性能和维护方面正确完成(例如规范化),连接也不错。
  2. 仅在实际出现需求时才去规范化。
  3. 一开始就遵循最可能正确(并且有效!)的路径,不要担心性能或其他事情。
  4. 过早的优化据说是万恶之母。
  5. 将适当的索引添加到外键(MySQL 自动覆盖这一点)和用于WHERE,ON等的字段ORDER BY
于 2012-10-06T14:48:21.903 回答