在数据库中存储多个枚举的最佳方法

时间:2014-02-28 19:42:15

标签: c# sql enums

我有一个名为RoleEnum的枚举,其中包含四个值User(1),Supervisor(2),Admin(3)和ITOperator( 4)。我有一个公告表,显然存储公告数据(标题,文本,开始和结束日期)。但是,我希望能够添加一个名为Roles的新列,用于定义哪些角色可以看到公告的用户。

通常在SQL中存储枚举时我只使用smallint数据类型,但是在这种情况下这不会起作用,因为可以通过多个角色看到通知。

我正在考虑的是将Roles列定义为varchar(x),并在存储它们时用逗号分隔它们。但是,我不认为/知道这是否是最好的选择。我不想创建一个新的表来保持一对多的关系。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

如果你关心可维护性,我会尽可能坚持第三范式。

角色

RoleID  RoleName
1       User
2       Supervisor
3       Admin
4       ITOperator

通告

AnnouncementID  Title   ...
1               Foo     ...
2               Bar     ...

AnnouncementsVisibility

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