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

时间:2014-01-29 14:27:02

标签: mysql sql join many-to-many

我有一种名为chain的数据。每个chain由另一种称为step的数据类型的特定序列组成。因此,chain最终由特定顺序的多个steps组成。我试图找出在MySQL中设置它的最佳方法,这将允许我执行以下操作:

  1. 查找链中的所有步骤,并按正确的顺序获取
  2. 查找包含步骤的所有链
  3. 我目前正在考虑将下表设置为适当的解决方案:

    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。但也许这并不罕见,我只是缺乏经验/偏执。

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

3 个答案:

答案 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表是它的正确位置恕我直言。

要考虑的一些事情:

  1. 外键 - 使用'em!
  2. chains_steps表上的唯一键 - 可以在单个链中的多个位置中存在一个步骤吗?在不同的链中怎么样?
  3. 祝你好运!

答案 2 :(得分:1)

你做对了。

考虑一个包含EmployeesProjects表的数据库,以及如何以多对多的方式链接它们。您可能会在某些命名约定中提出Assignments表(或Project_Employees)。

在某些时候,您决定不仅要存储每个项目作业,还要在作业开始时以及何时完成时存储。把它放在自然的地方就是任务本身;将它与项目或员工一起存储是没有意义的。

在进一步的设计中,您甚至可能发现有必要存储有关作业的更多信息,例如在员工评审过程中,您可能希望存储与其在该项目中的表现相关的反馈,因此您可以将作业设为“一个“与Review表格的关系结束,与Assignments上的FK相关联assignment_id

简而言之,拥有一个拥有自己数据的联结表是完全正常的。