我有一个名为RoleEnum
的枚举,其中包含四个值User
(1),Supervisor
(2),Admin
(3)和ITOperator
( 4)。我有一个公告表,显然存储公告数据(标题,文本,开始和结束日期)。但是,我希望能够添加一个名为Roles的新列,用于定义哪些角色可以看到公告的用户。
通常在SQL中存储枚举时我只使用smallint数据类型,但是在这种情况下这不会起作用,因为可以通过多个角色看到通知。
我正在考虑的是将Roles
列定义为varchar(x),并在存储它们时用逗号分隔它们。但是,我不认为/知道这是否是最好的选择。我不想创建一个新的表来保持一对多的关系。
有什么想法吗?
答案 0 :(得分:5)
如果你关心可维护性,我会尽可能坚持第三范式。
RoleID RoleName
1 User
2 Supervisor
3 Admin
4 ITOperator
AnnouncementID Title ...
1 Foo ...
2 Bar ...
AnnouncementID RoleID
1 1
1 2
2 2
2 3
2 4
答案 1 :(得分:3)
这是一种可能的解决方案 - 不保证是最好的,但不需要新表。
您可以在枚举上添加[Flags]
属性 - 这会使枚举成为可以将各个枚举值一起屏蔽的位字段。你的枚举将如下所示:
[Flags]
public enum RoleEnum : long
{
User = 1,
Supervisor = 2,
Admin = 4,
ITOperator = 8
}
你可以使用'|' (按位OR
)运算符将多个角色一起屏蔽在一个64位整数中,您可以在整数字段(bigint
)中将其存储在数据库中。
RoleEnum userRoles = RoleEnum.User | RoleEnum.Admin;
如果您不需要64个可能的角色,则可以使用int
代替 - 这将为您提供32种不同的角色。
答案 2 :(得分:0)
就像实体框架那样做并将它们存储为整数。
请查看此内容以了解详情... MSDN