MYSQL - один столбец на фрагмент данных или объединить в один столбец - PullRequest
1 голос
/ 18 июля 2009

Я создаю блог и сохраняю права пользователей (публиковать / редактировать / удалять сообщения в блоге) в таблице mysql.

Если я создам один столбец для разрешения или объединю все перкуссии в строку в одном столбце, например 101, это означает, что пользователь может публиковать и удалять, но не редактировать.

Причина, по которой я спрашиваю, заключается в том, что меня беспокоит слишком большое количество столбцов в моей таблице.

Ответы [ 5 ]

2 голосов
/ 18 июля 2009

Прежде всего, я бы исключил объединение всех разрешений в одно поле. Поначалу это кажется экономичным, но может превратиться в небольшую проблему, если вам когда-нибудь понадобится расширить или изменить структуру разрешений.

Создание столбца для каждого разрешения в пользовательской таблице - хороший вариант для простой системы, но может ограничить вашу возможность расширения в будущем.

Я рекомендую реализовать отношение «многие ко многим» между пользователями и разрешениями. Это позволяет вам добавлять столько типов разрешений, сколько вам нужно, без изменения схемы. Это очень легко сделать запрос с помощью простого объединения и переносится на другие базы данных.

Это достигается созданием двух новых таблиц. Предполагая следующую схему:

CREATE TABLE `users` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(100),
    -- other user fields --
);

Мы можем добавить схему разрешений m2m следующим образом:

CREATE TABLE `permissions` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL UNIQUE,
);

CREATE TABLE `users_permissions` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY_KEY,
    `user_id` INT NOT NULL,
    `permission_id` INT NOT NULL 
);

Затем вы можете добавить несколько примеров пользователей и разрешений:

INSERT INTO `users` (DEFAULT, 'joe');
INSERT INTO `users` (DEFAULT, 'beth');
INSERT INTO `users` (DEFAULT, 'frank');

INSERT INTO `permissions` (DEFAULT, 'Administrator');
INSERT INTO `permissions` (DEFAULT, 'Write Blog');
INSERT INTO `permissions` (DEFAULT, 'Edit Blog');
INSERT INTO `permissions` (DEFAULT, 'Delete Blog');

И, наконец, вы можете ассоциировать пользователей с разрешениями, например так:

-- joe gets all permissions
INSERT INTO `permissions` (DEFAULT, 1, 1);
INSERT INTO `permissions` (DEFAULT, 1, 2);
INSERT INTO `permissions` (DEFAULT, 1, 3);
INSERT INTO `permissions` (DEFAULT, 1, 4);

-- beth can write and edit
INSERT INTO `permissions` (DEFAULT, 2, 2);
INSERT INTO `permissions` (DEFAULT, 2, 3);

-- frank can only write
INSERT INTO `permissions` (DEFAULT, 3, 2);

Для небольшого блога вам может не понадобиться такая гибкая схема, но это проверенный дизайн. Если хотите, вы можете сделать еще один шаг вперед и создать систему ролей. Это работает путем предоставления каждому пользователю роли (один ко многим), и каждая роль имеет ряд разрешений (многие ко многим). Таким образом, нет необходимости устанавливать разрешения для каждого пользователя, и вы можете просто назначить им роль, например «Администратор», «Редактор» или «Участник», вместе со связанными разрешениями для этой роли.

2 голосов
/ 18 июля 2009

Рассмотрим mysql (нестандартный) Тип SET . Более опытные кодировщики могут предпочесть битовое поле (что на самом деле относится к типу SET mysql).

Не используйте строку, потому что:

  1. Строка - очень неэффективный способ хранения битовых значений - вы используете байт на флаг, где вам нужен только один бит
  2. Запросы к этому полю потребовали бы отвратительных манипуляций со строками и никогда не были бы эффективными
2 голосов
/ 18 июля 2009

Мой выбор - отдельные столбцы. Позволяет упростить запрос позже, если вы ищете конкретные разрешения.

Возможно, вы захотите проверить некоторые стандартные конструкции разрешений, не нужно изобретать колесо в четвертый раз:)

1 голос
/ 18 июля 2009

Я бы сказал, что было бы неплохо разместить сообщение, изменить и удалить столбец.

Но, если вы возьмете полномочия Wordpress, они просто сериализуют его в массив, а затем сохраняют этот массив в таблице настроек (4 столбца: идентификатор пользователя, ключ настройки, значение настройки). Я думаю, что метод Wordpress действительно работает, только если вы не собираетесь давать разрешения для своей таблицы.

Другим методом является создание User_ID - таблицы разрешений. В одном столбце укажите User_ID, а в другом - разрешение. Но сделайте для каждой строки разрешения. IE, если бы вы хотели предоставить ID 1 все права доступа, это было бы:

Разрешения: Добавить: 1, Редактировать: 2, Удалить: 3

Таблица

Строка 1: ИД пользователя: 1 Разрешение: 1

Строка 2: ИД пользователя: 1 Разрешение: 2

Строка 3: ИД пользователя: 1 Разрешение: 3

1 голос
/ 18 июля 2009

Вы можете использовать битовые комбинации (битовые поля) в одном столбце, как

const READ = 1;
const WRITE = 2;
const DELETE = 4;
...

поэтому полученное разрешение будет

read-only: 1
read-write: 3
read & delete, but not write: 5
and so on...

Чтобы проверить разрешение в битовом поле, ваш запрос должен выглядеть следующим образом:

SELECT * FROM table t WHERE t.permission & required_permission

с обязательным_разрешением, которое является побитовым или с необходимыми флагами разрешения.

Но я бы также порекомендовал проверить некоторые ресурсы, чтобы узнать о стандартных конструкциях ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...