【问题标题】:can a many to many relationship have another many to many relationship with another table?多对多关系可以与另一个表有另一个多对多关系吗?
【发布时间】:2019-11-07 22:46:40
【问题描述】:

考虑这种情况, 一个用户可以有很多组, 组可以有很多用户

只有属于特定组的人才能使用属于该组的汽车

所以我不确定表格会是什么样子

下面是表格

-- Creating a new User
INSERT INTO Users (UserLogin, UserPassword, UserName)
VALUES ('SomeUser', 'SecretPassword', 'UserName');

-- Creating a new Groups
INSERT INTO Groups (GroupName, GroupDescription)
VALUES ('GroupName', 'GroupDescription');

-- Finally, updating the junction
INSERT INTO UserGroup (UserId, GroupId)
VALUES ('UserId', 'GroupId');

考虑另一种桌车

INSERT INTO Cars (Name, Model)
VALUES ('SomeCar', 'Model');

只有属于某个组的人才能使用汽车S

那么汽车是否应该与 UserGroup 建立多对多的关系?

INSERT INTO CarUserGroup (UserGroupId, CarId)
VALUES ('UserGroupId', 'CarId');

或者组应该与汽车建立一对多的关系吗?

INSERT INTO Cars (Name, Model, GroupId)
VALUES ('GroupId','SomeCar', 'Model');

你能说出哪种方法最好吗?

谢谢

【问题讨论】:

    标签: mysql foreign-keys many-to-many relational-database one-to-many


    【解决方案1】:

    如果给定的汽车只能有一个组关系,那么理论上你的第二个版本可以工作:

    Cars (Name, Model, GroupId)
    

    但是,一旦汽车可以与多个组相关联,这种方法就变得不可取。原因是我们会复制汽车的元数据:

    SomeCar, SomeModel, Group1
    SomeCar, SomeModel, Group2
    

    一般来说,最好使用标准的联结表方法,并有一个只跟踪汽车和组之间关系的表:

    SomeCar, Group1
    SomeCar, Group2
    

    然后,让Cars 表存在来存储每辆车的元数据,一辆车只占用一条记录:

    SomeCar, SomeModel, SomeOtherMetadata
    

    【讨论】:

    • 那么 userGroyp 关系呢,它应该与汽车关系有什么关系
    • 不,如果用户和汽车会员是独立的东西,则不是。
    • 假设如果我使用这个 ``` Cars (Name, Model, GroupId),那么如果我想获取一个组中某个人的汽车,那么我必须使用某种查询userGroup 和汽车之间的关系对吗?
    • 你正在失去我...我不听你的要求。
    • 对不起,假设如果我使用这个表 => Cars (Name, Model, GroupId) ,那么如何获取组用户可以访问的汽车(我不太擅长 Sql 查询)
    【解决方案2】:

    因为,

    只有属于特定组的人才能使用属于该组的汽车

    因此,您应该在组和汽车之间创建一对多的关系。现在,为什么要这样做?这背后的直觉是,只有当它属于特定组时,用户才能拥有汽车,因此汽车的依赖性是对组的。但是由于 car 是 group 表的复合属性,因此您使其 owm 表具有一对多的关系。 还有一点是,当你删除一个组时,与这个组关联的所有汽车也应该被删除(这是可选的,你也可以有空外键,在这种情况下,如果你不想删除这些条目,它将是一个孤儿来自汽车表)。

    【讨论】:

    • 所以你说 userGroup 不应该与汽车表有任何关系
    • @Dom 是的,不应该。看看它应该如何工作,当用户属于某个组时可以访问汽车,所以首先你需要这个映射,现在最好的方法是将你的汽车模型修改为 - Cars (Name, Model, GroupId) 。因此,汽车模型现在与组具有一对多的关系。现在从 userGroup 表中你可以得到 groupId,从那里你可以找到属于一个用户的所有汽车。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多