逗号列表与多条记录

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)

用户可能是两个组的管理员。我没有看到多选外键的选项,但据我了解,在列中使用逗号分隔的列表是一个坏主意,我应该使用多条记录,但我不喜欢拥有多条记录的想法对于每个用户。

问:我如何跟踪用户是哪些组的管理员?

Aar*_*and 7

请不要将逗号分隔的列表存储在单个列中。这只是一场等待发生的灾难。如果这些是单独的事实,则应单独存储。

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)

  • @NicholasLAnderson 很棒,但我真的希望你不会同时拥有一个 `GroupMasters` 表和一个 `GroupUsers` 表(然后在你想出另一个角色时添加另一个表)。`RoleID` 列的重点是不要让数据全部与特定角色有关。 (2认同)