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
因此,简而言之,拥有拥有自己数据的连接表是完全正常的。感谢开发的关于连接表中额外数据的示例!