Mysql 如何为这种多对多关系设置关系数据库表?

Mysql 如何为这种多对多关系设置关系数据库表?,mysql,sql,join,many-to-many,Mysql,Sql,Join,Many To Many,我有一种叫做链的数据类型。每个链由另一种类型的数据的特定序列组成,称为步骤。因此,链最终由多个步骤按特定顺序组成。我正试图找出在MySQL中设置此功能的最佳方法,这将允许我执行以下操作: 查找链中的所有步骤,并将它们按正确的顺序排列 查找包含台阶的所有链 我目前正在考虑将下表设置为适当的解决方案: TABLE chains id date_created TABLE steps id description TABLE chains_steps (this would be use

我有一种叫做
链的数据类型。每个
由另一种类型的数据的特定序列组成,称为
步骤
。因此,
最终由多个
步骤
按特定顺序组成。我正试图找出在MySQL中设置此功能的最佳方法,这将允许我执行以下操作:

  • 查找链中的所有步骤,并将它们按正确的顺序排列
  • 查找包含台阶的所有链
  • 我目前正在考虑将下表设置为适当的解决方案:

    TABLE chains
    id   date_created
    
    TABLE steps
    id   description
    
    TABLE chains_steps  (this would be used for joins)
    chain_id   step_id   step_position
    
    在表
    chains\u steps
    中,将使用
    step\u position
    列对链中的步骤进行正确排序。联接表包含自己独特的数据段似乎不常见,例如本例中的
    step\u position
    。但也许这一点也不奇怪,我只是缺乏经验/偏执


    我在这方面没有太多经验,所以我想得到一些反馈。我建议的三张表是正确的方法吗?有没有可行的替代方案?如果有,优点/缺点是什么?

    看起来不错,而且联接表包含位置/等级字段也很常见

    查找链中的所有步骤,并将它们按正确的顺序排列

    SELECT * FROM chains_steps 
      LEFT JOIN steps ON steps.id = chains_steps.step_id 
      WHERE chains_steps.chain_id = ? 
      ORDER BY chains_steps.step_position ASC
    
    查找包含台阶的所有链

    SELECT DISTINCT chain_id FROM chains_steps 
      LEFT JOIN chains ON chains.id = chains_steps.chain_id
    

    我认为你概述的计划是正确的方法。不要太担心映射表上是否存在
    step\u position
    。毕竟
    步骤\u位置
    是与
    上下文中的
    步骤
    直接相关的一位数据。因此,
    chains\u steps
    表是它的正确位置

    需要考虑的一些事情:

  • 外键-使用它们
  • chains\u steps
    表上的唯一键-单链中的多个位置是否存在一个步骤?在不同的链条中呢
  • 祝你好运

    你做得对

    考虑一个包含
    员工
    项目
    表的数据库,以及您希望如何以多对多的方式将它们链接起来。您可能会提出一个
    Assignments
    表(或者在某些命名约定中是
    Project\u Employees

    在某个时刻,您会决定不仅要存储每个项目分配,还要存储分配开始的时间和完成的时间。任务本身的自然放置位置;将其与项目或员工一起存储是没有意义的

    在进一步的设计中,您甚至可能会发现有必要存储有关任务的进一步信息,例如,在员工审核流程中,您可能希望存储与其在该项目中的表现相关的反馈,因此您可以将任务作为与
    审核
    表的关系的“一”端,这将与
    作业
    相关,FK打开
    作业_id


    因此,简而言之,拥有拥有自己数据的连接表是完全正常的。

    感谢开发的关于连接表中额外数据的示例!