Nic*_*son 0 database-design role application-design users
我目前正在构建一个包含许多用户、两个角色和两个组的应用程序。从逻辑上讲,我们希望用户能够成为两个组内其他用户的管理员。
用户表
UserID varchar PK
DisplayName
Email
Role int FK `role`.`RoleID`
DATA [jschmo,Joe Schmo,joe@schmo.com,1]
Run Code Online (Sandbox Code Playgroud)
角色表
RoleID int PK AI
RoleName varchar
DATA [1=Master,2=Admin,3=User]
Run Code Online (Sandbox Code Playgroud)
组表
GroupID int PK AI
GroupName
DATA [1=Marketing,2=Infrastructure]
Run Code Online (Sandbox Code Playgroud)
用户可能是两个组的管理员。我没有看到多选外键的选项,但据我了解,在列中使用逗号分隔的列表是一个坏主意,我应该使用多条记录,但我不喜欢拥有多条记录的想法对于每个用户。
问:我如何跟踪用户是哪些组的管理员?
请不要将逗号分隔的列表存储在单个列中。这只是一场等待发生的灾难。如果这些是单独的事实,则应单独存储。
Table GroupMemberRoles
GroupID FK
UserID FK
RoleID FK
(PK on all three, with perhaps other constraints)
Run Code Online (Sandbox Code Playgroud)
您的查询(例如,查找某个组的管理员)应采用以下形式:
WHERE RoleID = 1 AND GroupID = @GroupID;
Run Code Online (Sandbox Code Playgroud)
并不是:
WHERE RoleID = 1 AND ',' + GroupIDList + ',' LIKE ',' + RTRIM(@GroupID) + ',';
Run Code Online (Sandbox Code Playgroud)
或者查找用户是哪些组的管理员应该同样简单:
WHERE RoleID = 1 AND UserID = @UserID;
Run Code Online (Sandbox Code Playgroud)