SQL Дизайн базы данных - Большая таблица разрешений - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть интересная проблема с дизайном для пользовательских разрешений в нашей существующей базе данных.

У нас есть большая таблица с более чем 10 миллионами записей, на которые теперь могут претендовать отдельные полномочия.

Я сразу же думаю, что ОК, создайте новую таблицу, у каждого пользователя есть свой собственный столбец, и доступ осуществляется с помощью битового значения.

           [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 столбцов: /

Так может ли кто-нибудь придумать лучший способ сделать это? Любые мысли или предложения будут с благодарностью приняты.

1 Ответ

0 голосов
/ 09 апреля 2020

Как я уже упоминал в комментариях, используйте нормализованный подход. Учитывая, что значение для allow / dey равно bit, на самом деле вы могли бы просто использовать 2 столбца, идентификатор пользователя и идентификатор записи:

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);

Что предоставит Пользователю с идентификатором 5 доступ к Записи с идентификатором 1.

...