【发布时间】:2016-05-03 14:46:18
【问题描述】:
我有一个使用 ASP.NET 标识的 ASP.NET MVC 应用程序。我的应用程序有 3 个角色:
- 学生
- 作者
- 管理员
这 3 个配置文件有不同的字段要保留,因此学生角色可能有 X 个字段、作者角色、Y 个字段和管理员角色、Z 个字段,所有这些都彼此不相关。问题是我想不出一种方法来做出优雅的设计。
这是我尝试过的/虽然到目前为止:
首先,我创建了 3 个不同的类(为每个角色),所以基本上我将拥有 Student、Author 和 Admin 表,它们与 ApplicationUser 表具有 1:1 的关系,但这不是一个干净的解决方案完全没有。
这是我目前实施的。我有一个 ApplicationUser 类(表),它包含这三个角色的所有公共字段。 对于它们中的每一个,我都创建了一个与 ApplicationUser 具有 1:1 关系的类(表)(充当“基”类(表))
我想出的另一个解决方案是将这些数据保存在无模式存储(例如表存储)中,PartitionKey 是 ApplicationUser.Id,RowKey 是 RoleId,这样我就可以轻松地对每个实体进行 CRUD。虽然这可能会有所帮助,但这种方法可能会导致维护 2 个不同的数据源,这不是我想要的。
对此有什么清洁设计的建议吗?
更新
从研究中我了解到模型继承/超类型-子类型关联可能是一个不错的方法。尤其是单表实现在性能上似乎也不错。 例如:
- 创建一个 ApplicationUser 表,其中包含所有字段(常见的和特定于子类型的)
- 为学生、作者和管理员提供 3 个额外视图。
可能会导致子类型特定字段的许多 null 值,但似乎是一个很好的解决方法。还有什么建议吗?
【问题讨论】:
-
学生可以成为作者,作者可以是管理员,管理员可以是学生吗?
-
@Erresen 学生永远不会拥有提升的权限。作者可以升级为管理员角色。管理员将保持管理员身份。所以本质上,只有作者才能成为管理员(如果管理员将他们添加为一个)。
-
学生、作者和管理员的字段之间(或三者中的任意两个)之间是否存在共性?如果不是,那么我将只使用三个单独的表(否则,如果您将作者升级为管理员,然后再降级,您可能会丢失数据)。如果有任何共同点,我会将这些字段放在 ApplicationUser 或另一个“基本”表中,然后为任何特定于类的字段添加额外的表。
-
@technophile这正是我现在所做的。我过滤掉了公共字段,它们都驻留在 ApplicationUser 表中。学生、作者和管理员只有他们的特定字段。我会更新这个问题,这样就可以清楚了。感谢您指出。
标签: sql-server asp.net-mvc asp.net-identity