团队可以拥有多个用户,但用户可以是多个团队的成员。
这是多对多的关系吗?如果是这样,我是否需要第三个表来加入MySQL?
答案 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
然后你必须声明实际的多对多关系。
它的工作方式基本相同,但你不会有任何其他信息关于这个男人和这个女人之间存在的东西,除了是的,他们之间发生了什么。我们不知道什么,我们不知道什么时候,我们不知道多久。
为此,您将替换oneToMany和manyToOne:
# Man:
ManyToMany:
woman:
target: Woman
# Woman:
ManyToMany:
man:
target: Man
但是如果没有良好的ORM支持,它就会变得难以管理。因此,第三方表通常仍然是最好和最简单的解决方案。此外,它允许您添加关于关系本身的信息。
答案 2 :(得分:1)
是的,这是多对多关系的一个例子。
这里users
是一个实体; Team
是另一个实体。实体都参与Membership
关系。
所以在将其转换为关系表时;你将不得不创建3个表。
一个前users
,另一个team
,另一个membership
(你可以有任何有意义的关系名称)关系,它将拥有来自两个表用户和团队的外键userid和teamid。