如何在 SQLite 中表示一组标志

How to represent a set of flags in SQLite

我有一个数据class:

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

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

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

我基本上看到三种方式:

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