Как представить набор флагов в SQLite - PullRequest
0 голосов
/ 07 мая 2018

У меня есть класс данных:

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

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

Что мне нужно сохранить в базе данных SQLite. Как я могу представить набор разрешений в базе данных?

1 Ответ

0 голосов
/ 07 мая 2018

Я вижу по существу три способа:

  • Вы можете перейти к полностью явному, реляционному и нормализованному: иметь таблицу с доступными разрешениями и таблицу мостов с идентификатором диалога и соответствующими разрешениями (классическое сопоставление «многие ко многим»); это может иметь смысл для чрезвычайно динамичных систем с новыми видами разрешений, добавляемыми динамически и т. п .; ИМО, как правило, больше хлопот, чем стоит, и совершенно неэффективно;
  • если тип разрешений не изменится со временем (и останется низким), вы можете встроить разрешения в схему диалоговой таблицы, чтобы у вас были can_edit, can_rename can_delete логические столбцы; это также довольно явно, но требует изменения схемы каждый раз, когда вы добавляете тип разрешения; также «загрязняет» схему диалоговой таблицы всеми типами разрешений, что может быть бременем, если их становится слишком много;
  • Вы можете перейти в «стиль разрешений Unix»: сделать ваши разрешения битовым полем (CAN_EDIT = 1, CAN_DELETE = 2, CAN_RENAME = 4), избавиться от вектора, сохранить значение OR-ed в поле unsigned, которое затем будет отражено в БД в одном столбце permissions; Мне этот вариант нравится больше всего, поскольку он требует только одного столбца, не требует дедупликации разрешений (это уже подразумевается в операторе OR) и без проблем масштабируется до 63 типов разрешений, не затрагивая схему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...