提问人:Megamozg 提问时间:5/7/2018 更新时间:5/7/2018 访问量:747
如何在SQLite中表示一组标志
How to represent a set of flags in SQLite
问:
我有一个数据类:
class Dialog {
public:
string name;
std::vector<Permission> permissions;
}
enum class Permission {
CAN_EDIT = 1,
CAN_DELETE,
CAN_RENAME
};
我需要将其保存在SQLite数据库中。如何在数据库中表示一组权限?
答:
2赞
Matteo Italia
5/7/2018
#1
我主要看到三种方式:
- 您可以完全显式、关系化和规范化:有一个具有可用权限的表,以及一个具有对话框 ID 和相关权限的桥接表(经典的多对多映射);这对于动态性极强的系统来说可能是有意义的,因为新的权限类型是动态添加的,等等;IMO通常比它的价值更麻烦,而且效率很低;
- 如果权限类型不会随时间推移而发生太大变化(并且会保持较低水平),则可以将权限嵌入到对话框表架构中,这样你将有一个 、 、 布尔列;这也非常明确,但每次添加权限类型时都需要更改架构;还会用所有权限类型“污染”对话框表架构,如果它们开始太多,这可能会成为一种负担;
can_edit
can_rename
can_delete
- 你可以去“Unix权限风格”:让你的权限成为位字段(),去掉向量,将OR-ed值存储在一个字段中,然后该值将镜像到数据库中的单个列中;我最喜欢这个,因为它只需要一列,不需要重复数据删除(它已经隐含在 OR 中),并且可以毫无问题地扩展到 63 种权限类型,而无需接触架构。
CAN_EDIT = 1, CAN_DELETE = 2, CAN_RENAME = 4
unsigned
permissions
评论
0赞
Megamozg
5/7/2018
谢谢你这么完整的回答。为它的明确性选择了第二个选项。
上一个:此成员函数属于哪个类?哎呀
下一个:GCD 如果为正数和负数
评论