MySQL多对多关系结构(a可以有很多b';s,但b也可以有很多a';s)


MySQL many to many relationship structure (a can have many b's but b can also have many a's)

正在寻找解决此问题的最佳方法。

基本上,这是一个设置,让工人们看看他们一天有什么工作
许多工人可以有相同的工作,每个工人可以有多份工作,每个工作可以有多个工人,但不一定是同一组工作。

示例:
工人a可能有工作1和2,并且
工人b可以具有作业1和作业3。

在数据库中连接这种关系的最佳示例或典型示例是什么?

我的用户表有我可以引用的id和用户名,但我正试图摆脱数据库中存储的某种列表,到目前为止,这是我唯一的想法,工人a有工作(1,2,9)。

实现这一点的常用方法是使用一个额外的表,该表保存工人和作业之间的关系。假设这个表名为workers_jobs,那么它将(至少)有worker_id和job_id列。如果一个id为15的工人有id为1,3,5的作业,那么你将创建三行

   worker_id | job_id
        15   |    1
        15   |    3
        15   |    5

对于反向关系,如果id为2的作业属于id为2、5、6、8的workers_jobs表将为

    worker_id | job_id
          2   |    2
          5   |    2
          6   |    2
          8   |    2

存储逗号分隔的值不是一个好主意,这里提供了一个很好的解释

处理多对多关系的标准方法是拥有一个额外的表。

workers_jobs:

| id   | worker_id | job_id |
-----------------------------
| 1    | 1         | 1      | 
| 2    | 1         | 2      |
| 3    | 2         | 1      |
| 4    | 2         | 3      |

通过这种方式,您可以从worker_jobs表中选择特定工人的所有作业,以及特定作业的所有工人。

例如:

SELECT * FROM workers 
    INNER JOIN workers_jobs ON workers.id = workers_jobs.worker_id 
    INNER JOIN jobs ON on workers_jobs.job_id = jobs.id
相关文章: