2

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

如何在数据库中建模?谢谢

编辑:我正在为这个模型在数据库端寻找一些标准解决方案。类似上面的场景也有。例如:用户密码历史记录:一个用户最多可以有 10 个以前的密码存储在 pwd_history 表中。这是一种一对(0-10)的关系。

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

4

5 回答 5

4

有3种策略:

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

  2. 将其建模为多对多,但放置额外的约束来限制行数:

    在此处输入图像描述

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

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

  3. 只需有五个可空的一对多关系:

    在此处输入图像描述


在所有这些策略中,我的第一直觉是选择(2)——它可能是“最干净的”,并且如果你的限制发生变化,它很容易修改。

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

(1) 正确实施将是一件痛苦的事情 - 您必须非常小心地进行锁定以避免并发问题,并且可能会破坏过程中的可伸缩性。

于 2013-05-08T20:03:50.987 回答
2

创建用户角色表

UserRoleID    PK
UserID        FK
RoleID        FK

您必须使用 INSERT 触发器(此处的示例)或在应用程序的业务逻辑中强制执行 5 个角色约束。

于 2013-05-08T19:34:43.140 回答
1

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

于 2013-05-08T19:36:52.750 回答
0

我没有在 DB 中使用它,但是在c语言中用于其他目的时,我遵循了这种方法。

考虑 Role1、Role2 ... Role5

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

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

维护roles在 DB 中调用的单个列。并遵循这一点,

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 OR Role3(role_column || 8)将返回 true。

它保存新表;可以在字段中保存不同的数字(最多为 8 位。8 位 = 1 个字节);一个简单的查询,甚至没有连接。

于 2013-05-08T19:47:51.223 回答
0

也许这不是一个规范化的设计,但对于少数角色,您可以只为 user、role1、role2 等添加 5 个可为空的列,尽管这会使更新变得复杂。

于 2013-05-08T19:36:18.050 回答