使用按位枚举的优点/缺点?

时间:2017-02-27 11:36:08

标签: c#

上下文:数据库规范化,我正在创建一个表:UserInvolvement。 有许多方法(基于角色和其他方式)User可以涉及另一个实体:Foo。在当前情况下,每种类型的参与都作为单独的列添加到Foo表上,该列保存对用户的引用。但是,当多个用户在Foo中有相同类型的参与时,这种类型的存储空间很短。

他们决定在该参与专栏中将该FK作为CSV存储到用户。是的OMG!我也不相信。

所以现在我正在创建UserInvolvement表:

  • FooID
  • 用户ID
  • 参与

参与将是代码中的枚举器。

现在我的问题是: 我应该创建一个普通的枚举器吗? 或者我应该使用按位枚举?

如果我选择按位枚举:我可以使FooIDUserID组合唯一。并且在小规模上它将减少该表中的记录总量。用户或者是否有参与Foo的类型。它的布尔值。没有多次涉及相同类型的参与。

我看到的挑战:这确实需要我始终翻译' Involvement使用按位运算来检查实际的Involvement。如何使用EF在数据访问层中实现此功能?当我删除用户参与时,我应该更新按位值。除非没有标记,否则应删除它。

我忽略了其他任何影响吗? 最后:什么是最佳选择?正常的枚举或按位枚举?

1 个答案:

答案 0 :(得分:5)

不同之处在于Flags(按位枚举)可以同时包含多个State。

如果您有评分系统,可以使用标志

[Flags] public enum Rating {
    Normal    = 0,   // 00000000
    Great     = 1,   // 00000001
    Super     = 2,   // 00000010
    Mega      = 4,   // 00000100
    Legendary = 8    // 00001000
}

标志检查位。注意这个事实。

普通枚举不要关心这种效果。每个枚举都是唯一的

public enum State{
    Normal    = 0,
    Great     = 1,
    Super     = 2,
    Mega      = 3,
    Legendary = 4
}

现在,您只能检查一个State,而不是多个States

对于UserRoles,您可以使用Flags,因为管理员将拥有UserModerator等权限。

[Flags] public enum Role{
    None      = 0,    // 00000000
    View      = 1,    // 00000001
    Write     = 2,    // 00000010
    Execute   = 4,    // 00000100
}

您可以将类定义中的permutation定义为

[Flags] public enum Role{
    None      = 0,                   // 00000000
    View      = 1,                   // 00000001
    Write     = 2,                   // 00000010
    Execute   = 4,                   // 00000100
    ViewWrite = (View | Write)       // 00000011
    ViewExecute = (View | Execute)   // 00000101
    WriteExecute = (Write | Exectue) // 00000110
    All = (View | Write | Exectue)   // 00000111
}

或代码中:

Role role = Role.View | Role.Write;

Here you can find a great article about what to use.