SQL 数据库设计 - 大权限 table

SQL Database design - Large permission table

我对现有数据库的用户权限设计有一个有趣的问题。

我们有一个庞大的 table 记录,其中包含超过 1000 万条记录,现在的当权者需要单独的权限。

我马上觉得好吧,创建一个新的table,每个用户都有自己的列,访问是用一个位值完成的。

           [U1]  [U2]  [U3]  [U4] etc.
=============================================
Record 1 |  1  |  0  |  1  |  0  |
Record 2 |  0  |  0  |  1  |  1  |
Record 3 |  0  |  1  |  1  |  0  |
Record 4 |  1  |  0  |  1  |  1  |

然后我被告知预计会有 300 个用户,因为我们允许对数据库进行更多访问,这意味着 300 列:/

所以有人能想出更好的方法吗?如有任何想法或建议,我们将不胜感激。

就像我在评论中提到的那样,使用规范化方法。考虑到 allow/dey 的值是 bit,您实际上可以只使用 2 列,即用户 ID 和记录 ID:

CREATE TABLE dbo.UserAllowPermissions (UserID int,
                                       RecordID int);
ALTER TABLE dbo.UserAllowPermissions
ADD CONSTRAINT PK_UserRecordPermission
    PRIMARY KEY CLUSTERED (UserID,RecordID);

然后你可以INSERT你上面已有的数据,如下所示:

INSERT INTO dbo.UserAllowPermissions (UserID,
                                      RecordID)
VALUES (1, 1),
       (1, 4),
       (2, 3),
       (3, 1),
       (3, 2),
       (3, 3),
       (3, 4),
       (4, 2),
       (4, 4);

如果要撤销某个用户的权限,只需删除相关行即可。例如,假设您要撤销用户 3 对记录 4 的权限:

DELETE
FROM dbo.UserAllowPermissions
WHERE UserID = 3
  AND RecordID = 4;

而且,不出所料,如果您想授予用户权限,只需 INSERT 行:

INSERT INTO dbo.UserAllowPermissions (UserID, RecordID)
VALUES(5,1);

这将授予 ID 为 5 的用户访问 ID 为 1 的记录的权限。