Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 针对多对多关系的最佳MySql数据库设计_Php_Mysql_Relational Database - Fatal编程技术网

Php 针对多对多关系的最佳MySql数据库设计

Php 针对多对多关系的最佳MySql数据库设计,php,mysql,relational-database,Php,Mysql,Relational Database,我在MySql数据库中有6个表,需要相互连接(这6个表必须以任何可能的方式关联)。我还需要在这些关系中添加一个“排序顺序”列。 使用“经典的ManyToMany”连接表将导致一个混乱的数据库,其中包含数十个连接表。这是不可能维持的。 我能找到的最佳解决方案是使用一个包含7列的联接表(6个条目ID对应6个条目,排序顺序对应1个条目),其中每一行标识两个表之间的单个关联 下面是我创建的联接表: mysql> desc relations; +------------+---------+---

我在MySql数据库中有6个表,需要相互连接(这6个表必须以任何可能的方式关联)。我还需要在这些关系中添加一个“排序顺序”列。 使用“经典的ManyToMany”连接表将导致一个混乱的数据库,其中包含数十个连接表。这是不可能维持的。 我能找到的最佳解决方案是使用一个包含7列的联接表(6个条目ID对应6个条目,排序顺序对应1个条目),其中每一行标识两个表之间的单个关联

下面是我创建的联接表:

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

  • 如果在性能和维护方面做得正确(例如,标准化),连接也不错
  • 只有在实际需求出现时才取消正常化
  • 在开始时遵循最可能正确的(和有效的!)路径,不要担心性能或其他问题
  • 据说,过早的优化是万恶之母
  • 将适当的索引添加到外键(MySQL会自动覆盖这一点)以及
    WHERE
    ON
    ORDER BY
    等中使用的字段

  • 请不要照你的建议去做。你是对的:如果你的实体之间有很多多对多的关系,你会有很多联接表。但这是一个比你提出的更好的解决方案。真的

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

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

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


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

    下次请从您的终端复制/粘贴到问题中。突出显示并ctl-k以格式化代码块。谢谢。您确认除了“传统”方法之外,没有其他方法可以实现该目标。但我仍然有一些疑问。如果我没有出错,我将有30个联接表。对于另一个开发者来说,30比1会更好吗?如果我需要添加新项目怎么办?我应该在设计中再增加7张表。考虑到管理这些关系的代码将在一个类中使用一些方法,或者静态方法易于使用和重用。我想知道在这种情况下,当你有这样的特殊需要时,规则是否比逻辑更重要。谢谢你的回答。其实我不太在乎这个阶段的表现。我不知道这种设计在性能方面是否比30个联接表更好。你也知道吗?@e.a.在什么样的查询中,你需要连接30个表?除非对关系/外键等的使用存在误解,否则您的表名看起来非常清晰,不需要太多的联接。您能给出一个推理示例吗?我有6个表:每个表有5个关系。这意味着30个联接表vs 1(我发布的示例)。你能发布一个需要联接30个表的示例SQL查询吗?有一个误解:我永远不需要联接30个表。我只需要30个连接表在我的数据库,能够得到所有可能的关系。示例:在艺术家页面中,我将拥有与该艺术家相关的所有艺术品、展览、版本、新闻稿和新闻。对于每一项,我需要以相同的方式获得所有关联。目前,我想我应该做6个独立的查询:每个关系一个查询。