如何建模数据库中的多对多关系?

时间:2013-05-08 19:32:46

标签: database database-design

这并不是多对多的关系。 例如: 我有一个User表和一个Role表。 约束是用户可以拥有0-5个角色,并且可以将角色分配给许多用户。

如何在数据库中对此进行建模? 感谢

编辑:我正在为这个模型寻找数据库方面的标准解决方案。有类似的情况,如上所述。例如:用户密码历史记录: 一个用户将在pwd_history表中存储最多10个以前的密码。这有点儿 一对多(0-10)的关系。

但在我看来,数据库方面没有标准的解决方案。 (@ Branko下面的解决方案(2)看起来不错。) 我想这个模型的最佳实践是在客户端强制执行,使这些数字在属性文件中可配置并实现客户端逻辑来处理这个问题。

5 个答案:

答案 0 :(得分:4)

有三种策略:

  1. 只需将其建模为数据库中的正常多对多,但在触发器或(理想情况下)客户端代码中强制执行限制。

  2. 将其建模为多对多,但要设置其他约束以限制行数:

    enter image description here

    CHECK (ROLE_NO IN (1, 2, 3, 4, 5))

    U1上的UNIQUE约束{USER_ID, ROLE_NO}和上面的CHECK的组合确保了属于同一用户的USER_ROLE行数不能超过五个。

  3. 只需要五个可以为空的1对多关系:

    enter image description here


  4. 在所有这些策略中,我的第一直觉是(2) - 它可能是“最干净”的,并且如果你的极限发生变化,可以轻易修改。

    (3)可能在某些情况下性能更高(尽管在其他情况下也可能更慢),但使用起来很尴尬,而且灵活性也不大。

    (1)将很难正确实现 - 您必须非常小心地执行锁定以避免并发问题,并且可能会破坏该过程中的可伸缩性。

答案 1 :(得分:2)

创建UserRoles表

UserRoleID    PK
UserID        FK
RoleID        FK

您必须使用INSERT触发器(示例here)或应用程序的业务逻辑强制实施5角色约束。

答案 2 :(得分:1)

实现与多对多实现相同,但您必须在编码中限制关系表中的角色数量,避免在达到限制5时添加更多数据。

答案 3 :(得分:0)

也许这不是规范化设计,但对于少量角色,您只需向用户,角色1,角色2等添加5个可空列,尽管这会使更新复杂化。

答案 4 :(得分:0)

我没有在数据库中使用它,但是当用c语言用于其他目的时,我已经遵循了这个方法。

考虑Role1,Role2 ...... Role5

Role  => Bit-Pattern => Number
-------------------------------

Role1 => 00000001 => 2
Role2 => 00000010 => 4
Role3 => 00000100 => 8
Role4 => 00001000 => 16
Role5 => 00010000 => 32

在DB中维护名为roles的单列。并按照这个,

Role1 + Role2  ==> 2 + 4 ==> 6
Role1 + Role2 + Role5  ==> 2 + 4 + 32 ==> 38
Role3 + Role4 ==> 8 + 16 ==> 24

对于38的用户,表格仅包含Role1 + Role2 + Role5

因此要检查用户是否有角色role3,请执行Role3 ==> role_col或Role3 (role_column || 8)将返回true。

保存新表;字段中可以容纳不同的数字(这里是8位.8位= 1字节);单一简单查询,甚至没有连接。