我有一种名为chain
的数据。每个chain
由另一种称为step
的数据类型的特定序列组成。因此,chain
最终由特定顺序的多个steps
组成。我试图找出在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_steps
中,step_position
列将用于正确排序链中的步骤。 JOIN表似乎不常见,包含自己独特的数据,例如step_position
。但也许这并不罕见,我只是缺乏经验/偏执。
我没有太多经验,所以我想得到一些反馈。这三个表我建议正确的方法吗?有没有可行的替代品?如果有,有什么优点/缺点?
答案 0 :(得分:1)
看起来很好,连接表包含位置/等级字段并不罕见。
查找链中的所有步骤,并按正确的顺序获取它们
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
答案 1 :(得分:1)
我认为您概述的计划是正确的方法。不要过分担心映射表中是否存在step_position
。毕竟step_position
是与step
上下文中的chain
直接相关的一些数据。所以chains_steps
表是它的正确位置恕我直言。
要考虑的一些事情:
chains_steps
表上的唯一键 - 可以在单个链中的多个位置中存在一个步骤吗?在不同的链中怎么样?答案 2 :(得分:1)
你做对了。
考虑一个包含Employees
和Projects
表的数据库,以及如何以多对多的方式链接它们。您可能会在某些命名约定中提出Assignments
表(或Project_Employees
)。
在某些时候,您决定不仅要存储每个项目作业,还要在作业开始时以及何时完成时存储。把它放在自然的地方就是任务本身;将它与项目或员工一起存储是没有意义的。
在进一步的设计中,您甚至可能发现有必要存储有关作业的更多信息,例如在员工评审过程中,您可能希望存储与其在该项目中的表现相关的反馈,因此您可以将作业设为“一个“与Review
表格的关系结束,与Assignments
上的FK相关联assignment_id
。
简而言之,拥有一个拥有自己数据的联结表是完全正常的。