简单的多对多关系

时间:2014-01-31 21:42:55

标签: mysql sql

道歉,我没有睡觉,所以只想澄清一下我的想法。

团队可以拥有多个用户,但用户可以是多个团队的成员。

这是多对多的关系吗?如果是这样,我是否需要第三个表来加入MySQL?

3 个答案:

答案 0 :(得分:3)

是。你几乎肯定需要有第三个'关系'表。

最简单的选择是建立一个表示团队用户的关系表。

团队== Rel ===用户

要查询团队中的用户,请搜索针对teamId的所有usersId的rel,反之亦然,以检查用户所属的团队。

答案 1 :(得分:2)

多对多关系

存在多对多关系,并且您指出它的工作方式与多对一/一对多不同。所以它根本不是 一个愚蠢的问题。

大多数情况下,您需要添加对此关系具有特征的额外字段。因为您希望获得关于您自己关系的信息

您是否需要额外信息(以及额外的字段)将决定您是否需要第三方的表格。

现实生活中的例子:男人和女人妇女

假设你有男女表。一个男人可以通过他的生活和相互的方式约会许多女性。所以,你有一个典型的多对多关系。你可以在没有第三张桌子的情况下完成。

但是现在,假设你想要添加一个信息:对于每个关系(无论是浪漫意义上还是数据库意义上的(从未想过我会在生命的某一天说出这句话)),你想告诉我什么时候工会开始了,结束了。

然后你需要第三部分表。

结构

让我们来看看我们的现实生活中的示例结构。

我是用简化版Doctrine2-inspired Yaml写的,默认情况下运行Symfony2的模型:

tableName: Man
    fields:
        id:
            type: int
            id: true
        firstName:
            type: string
        dateOfBirth:
            type: datetime
        favSport:
            type: string
        womenHePrefers:
            type: string
    oneToMany:
        relationships:
            target: ManMeetsWoman
            mappedBy: man
            cascade: remove

tableName: Woman
    fields:
        id:
            type: int
            id: true
        firstName:
            type: string
        dateOfBirth:
            type: datetime
        favAuthor:
            type: string
        menShePrefers:
            type: string
    oneToMany:
        relationships:
            target: ManMeetsWoman
            mappedBy: woman
            cascade: remove

tableName: ManMeetsWoman
    fields:
        id:
            type: int
            id: true
        dateOfEncounter:
            type: datetime
        dateOfBreakUp:
            type: datetime
    manyToOne:
        man:
            target: Man
            inversedBy: relationships
        woman:
            target: Woman
            inversedBy: relationships

要点

  • 您的男女表格与您的ManMeetsWoman表格之间存在 oneToMany 关系
  • 您的 ManMeetsWoman 表格会有 manyToOne 与其他两个表的关系
  • 理想情况下,您会放置级联规则,以确保从Man表中删除Man时,引用他的关系也会从第三个表中消失。

如果您不想要另一张桌子

,该怎么办?

然后你必须声明实际的多对多关系

它的工作方式基本相同,但你不会有任何其他信息关于这个男人和这个女人之间存在的东西,除了是的,他们之间发生了什么。我们不知道什么,我们不知道什么时候,我们不知道多久。

为此,您将替换oneToMany和manyToOne:

# Man:
    ManyToMany:
        woman:
            target: Woman

# Woman:
    ManyToMany:
        man:
            target: Man

但是如果没有良好的ORM支持,它就会变得难以管理。因此,第三方表通常仍然是最好和最简单的解决方案。此外,它允许您添加关于关系本身的信息。

答案 2 :(得分:1)

是的,这是多对多关系的一个例子。

这里users是一个实体; Team是另一个实体。实体都参与Membership关系。

所以在将其转换为关系表时;你将不得不创建3个表。

一个前users,另一个team,另一个membership(你可以有任何有意义的关系名称)关系,它将拥有来自两个表用户和团队的外键userid和teamid。