上下文:数据库规范化,我正在创建一个表:UserInvolvement
。
有许多方法(基于角色和其他方式)User
可以涉及另一个实体:Foo
。在当前情况下,每种类型的参与都作为单独的列添加到Foo表上,该列保存对用户的引用。但是,当多个用户在Foo中有相同类型的参与时,这种类型的存储空间很短。
他们决定在该参与专栏中将该FK作为CSV存储到用户。是的OMG!我也不相信。
所以现在我正在创建UserInvolvement
表:
参与将是代码中的枚举器。
现在我的问题是: 我应该创建一个普通的枚举器吗? 或者我应该使用按位枚举?
如果我选择按位枚举:我可以使FooID
和UserID
组合唯一。并且在小规模上它将减少该表中的记录总量。用户或者是否有参与Foo的类型。它的布尔值。没有多次涉及相同类型的参与。
我看到的挑战:这确实需要我始终翻译' Involvement使用按位运算来检查实际的Involvement。如何使用EF在数据访问层中实现此功能?当我删除用户参与时,我应该更新按位值。除非没有标记,否则应删除它。
我忽略了其他任何影响吗? 最后:什么是最佳选择?正常的枚举或按位枚举?
答案 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,因为管理员将拥有User
和Moderator
等权限。
[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;