如何在SQLite中表示一组标志

时间:2018-05-07 06:32:51

标签: c++ sqlite language-agnostic

我有一个数据类:

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

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

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

1 个答案:

答案 0 :(得分:1)

我基本上看到三种方式:

  • 你可以完全显式,关系和规范化:拥有一个包含可用权限的表,以及一个包含对话框ID和相关权限的桥表(经典的多对多映射);这对于极其动态的系统可能有意义,动态添加新的权限类型等; IMO通常比它的价值更麻烦,而且效率很低;
  • 如果权限类型随着时间的推移不会发生很大变化(并且会保持低水平),您可以将权限嵌入到对话框表架构中,这样您就可以{{1 },can_editcan_rename布尔列;这也非常明确,但每次添加权限类型时都需要更改架构;也&#34;污染&#34;具有所有权限类型的对话框表模式,如果它们开始太多,则可能成为负担;
  • 你可以去&#34; Unix权限样式&#34;:使你的权限变成一个字段(can_delete),摆脱向量,将OR-ed值存储在CAN_EDIT = 1, CAN_DELETE = 2, CAN_RENAME = 4中字段,然后将在单个unsigned列中的数据库中镜像;我最喜欢这个,因为它只需要一个列,不需要权限的重复数据删除(它已经隐含在OR中),并且在不必触及模式的情况下可以扩展到最多63个权限类型的问题。