如何在SQLite中表示一组标志

How to represent a set of flags in SQLite

提问人:Megamozg 提问时间:5/7/2018 更新时间:5/7/2018 访问量:747

问:

我有一个数据类:

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

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

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

与 C++ SQLite 语言无关

评论

1赞 Matteo Italia 5/7/2018
我会把它做成一个位掩码,去掉向量,直接把数值写在数据库中。

答:

2赞 Matteo Italia 5/7/2018 #1

我主要看到三种方式:

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

评论

0赞 Megamozg 5/7/2018
谢谢你这么完整的回答。为它的明确性选择了第二个选项。