Я часто сталкиваюсь со следующим сценарием, когда мне нужно предложить множество разных типов разрешений. Я в основном использую ASP.NET/VB.NET с SQL Server 2000.
Сценарий
Я хочу предложить динамическую систему разрешений, которая может работать с различными параметрами. Скажем, что я хочу предоставить либо отдел, либо только конкретный человек, доступ к приложению. И притворяйтесь, что у нас есть ряд приложений, которые продолжают расти.
В прошлом я выбрал один из следующих двух способов, которые я знаю для этого.
1) Используйте единую таблицу разрешений со специальными столбцами, которые используются для определения того, как применять параметры. Специальные столбцы в этом примере - TypeID и TypeAuxID. SQL выглядел бы примерно так.
SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1
2) Используйте таблицу сопоставления для каждого типа разрешений, а затем объедините их все вместе.
SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE [email protected]
AND ([email protected] OR [email protected] OR
(emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC
Мои мысли
Надеюсь, что примеры имеют смысл. Я собрал их вместе.
Первый пример требует меньше работы, но ни один из них не чувствует себя лучшим ответом. Есть ли лучший способ справиться с этим?