如何在 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_edit
、can_rename
、can_delete
布尔列;这也很明确,但是每次添加权限类型时都需要更改架构;还有 "pollutes" 具有所有权限类型的对话框 table 模式,如果它们开始太多,这可能是一种负担;
- 你可以去"Unix permissions style":让你的权限成为一个位字段(
CAN_EDIT = 1, CAN_DELETE = 2, CAN_RENAME = 4
),摆脱向量,将OR-ed值存储在unsigned
字段中,这然后将在数据库中的单个 permissions
列中进行镜像;我最喜欢这个,因为它只需要一个列,不需要删除重复权限(它已经隐含在 OR 中),并且可以毫无问题地扩展到 63 种权限类型,而无需触及架构。
我有一个数据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_edit
、can_rename
、can_delete
布尔列;这也很明确,但是每次添加权限类型时都需要更改架构;还有 "pollutes" 具有所有权限类型的对话框 table 模式,如果它们开始太多,这可能是一种负担; - 你可以去"Unix permissions style":让你的权限成为一个位字段(
CAN_EDIT = 1, CAN_DELETE = 2, CAN_RENAME = 4
),摆脱向量,将OR-ed值存储在unsigned
字段中,这然后将在数据库中的单个permissions
列中进行镜像;我最喜欢这个,因为它只需要一个列,不需要删除重复权限(它已经隐含在 OR 中),并且可以毫无问题地扩展到 63 种权限类型,而无需触及架构。