我在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作为框架。
答案 0 :(得分:2)
WHERE
,ON
,ORDER BY
等中使用的字段。答案 1 :(得分:2)
请不要做你的建议。你是对的:如果你的实体之间有很多多对多的关系,你会有很多连接表。但这比你建议的解决方案要好得多。认真。
它会表现得更好,因为你的连接表中没有任何空id值,这意味着你将获得索引的全部好处。
您的实体关系将更容易更新和排除故障。
在您转移到其他内容之后维护代码的人不会诅咒您的名字。换句话说,您将使用传统的dbms设计技术来解决传统问题,并且您的设计将是透明的。
有许多架构设计工具可以帮助您为所有这些连接表生成DDL。提示:确保您的id列在整个过程中均匀命名。也就是说,在艺术家表格中,在artist_art表格和artist_edition表格中将其命名为artist_id。如果这样做,架构设计工具可以自动整理你正在做的事情。