C++ 如何在SQLite中表示一组标志

C++ 如何在SQLite中表示一组标志,c++,sqlite,language-agnostic,C++,Sqlite,Language Agnostic,我有一个数据类: class Dialog { public: string name; std::vector<Permission> permissions; } enum class Permission { CAN_EDIT = 1, CAN_DELETE, CAN_RENAME }; 我需要保存在SQLite数据库中。如何在数据库中表示一组权限 我基本上看到了三种方式: 您可以完全显式、关系式和规范化:拥有一个具有可用权限的表,以及一个

我有一个数据类:

class Dialog {
public:
    string name;
    std::vector<Permission> permissions;
}

enum class Permission {
   CAN_EDIT = 1,
   CAN_DELETE,
   CAN_RENAME
};

我需要保存在SQLite数据库中。如何在数据库中表示一组权限

我基本上看到了三种方式:

您可以完全显式、关系式和规范化:拥有一个具有可用权限的表,以及一个具有对话框ID和相关权限的桥接表经典的多对多映射;这对于动态性极强的系统来说是有意义的,比如动态添加新的权限类型等等;IMO通常比它的价值更麻烦,而且效率相当低; 如果权限类型不会随着时间的推移发生太大变化,并且会保持较低的级别,则可以将权限嵌入到对话框表模式中,这样就可以进行can_编辑、can_重命名、can_删除布尔列;这也是非常明确的,但每次添加权限类型时都需要更改模式;还污染了所有权限类型的对话框表模式,如果权限类型太多,可能会造成负担; 您可以使用Unix权限样式:将您的权限设为位字段can_EDIT=1、can_DELETE=2、can_RENAME=4、除去向量、将或有符号的值存储在无符号字段中,然后在DB中的单个权限列中镜像该字段;我最喜欢这一个,因为它只需要一列,不需要重复删除权限—它已经隐含在OR中,并且可以毫无问题地扩展到63种权限类型,而无需接触模式。
我会把它做成一个位掩码,去掉向量,直接在数据库中写下数值。谢谢你给出了这样一个完整的答案。选择第二个选项是为了它的明确性。