Sql 复杂的用户角色多对多设置

Sql 复杂的用户角色多对多设置,sql,entity-framework,database-design,Sql,Entity Framework,Database Design,我正在写一个后端调查数据库。数据库是用于收集测量类型数据的多个应用程序的后端。我有一个模式,其中包括一个表,用于指定应用程序以及属于该应用程序的问题 现在我需要设置用户和用户角色 每个用户可以访问一个或多个应用程序 每个应用程序都有一个或多个用户 每个用户在其有权访问的应用程序中可以有1个角色 每个角色可能存在于一个或多个应用程序中 每个用户在每个应用程序中可能有不同的角色 app1有15个用户1个用户是管理员 app1为用户访问定义了2个角色 app2有30个用户app1中的管理员用户具有访问

我正在写一个后端调查数据库。数据库是用于收集测量类型数据的多个应用程序的后端。我有一个模式,其中包括一个表,用于指定应用程序以及属于该应用程序的问题

现在我需要设置用户和用户角色

每个用户可以访问一个或多个应用程序 每个应用程序都有一个或多个用户

每个用户在其有权访问的应用程序中可以有1个角色 每个角色可能存在于一个或多个应用程序中 每个用户在每个应用程序中可能有不同的角色

app1有15个用户1个用户是管理员 app1为用户访问定义了2个角色

app2有30个用户app1中的管理员用户具有访问权限,但为普通用户 app2中的2个管理员用户作为普通用户存在于app1中 app2为用户访问定义了4个角色

警告自由形式思维过程

所以我有


Application->ApplicationUsers我认为可能有几种不同的方法来实现这些关系,决定最佳方法的最大因素是您打算如何使用数据。正如你所描述的,可以用四个表来完成,我更喜欢单数形式,而不是复数形式——取决于个人,但如果其他表是复数形式,你应该保持一致并应用它。因为关系是由所有三个实体定义的,所以这应该是表的结构。然而,要问的一个问题是,这些关系是否正常?我认为很明显,无论应用程序是否有用户,应用程序都可以存在,就像可能说的用户一样,无论它当前是否与应用程序关联。但是,如果角色与应用程序无关,它是否会存在?可能不是因为角色(即使它可能共享相同的名称)在每个应用程序中可能并不完全相同

另一种可能在逻辑上更清晰(更好?)的选择是,有一个包含应用程序FK的Role(AppRole?)表和一个与用户相关的UserAppRole表。这将允许您定义与应用程序相关的角色,并通过适当的角色将用户与应用程序关联

应用 平易近人 使用者 用户许可

就像我说的,有很多方法和很多决定因素

每个用户在中可以有一个角色 他们可以访问每个应用程序 角色可能存在于一个或多个 每个用户可能拥有的应用程序 每个应用程序中的不同角色

应该像这样加标点符号

每个用户在中可以有一个角色 他们可以访问的应用程序,每个 角色可能存在于一个或多个 应用程序,每个用户可能有 每个应用程序中的不同角色

如果第一个子句意味着每个用户在他们有权访问的每个应用程序中必须有一个且不超过一个角色,那么您的模式将无法工作。ApplicationUserRoles中的复合主键{ApplicationId,UserID,RoleID}允许每个用户具有多个角色

要限制“每个应用程序每个用户一行(和一个角色)”约束,ApplicationUserRoles的主键应仅为{ApplicationID,UserID}


此外,如果UserID在表Users中是唯一的,那么它可能应该是主键,并且您可能应该从该表中删除列“ID”。

+1到jdcook72有两个原因:(a)使用单数表名。这在任何时候都是一种更好的做法,但在EF中尤其如此,因为您的模型将希望将作为相关子实体集合的导航属性多元化,(b)角色属于应用程序,因为应用程序A中的管理员与应用程序b中的管理员不同。这是一种直接的父/子关系,而不是交叉点。值得一提的是,jdcook称之为“UserAppRole”,我将其称为ROLE\u MEMBER.Yes。在我当前的工作环境中,表是根据它们的关系结构命名的,OP描述UserAppRole正是它最初从我脑海中浮现出来的方式,我的思维定势与这些标准背道而驰。考虑到我的鼓声,我会使用RoleMember,因为它在语义上是有意义的,我认为这是表名的优先级。虽然我必须承认,能够从表名中获得一些结构是很方便的,但这正是ERD真正的用途。