Тип данных enum против таблицы данных в MySQL? - PullRequest
7 голосов
/ 02 июня 2010

У меня есть одна таблица MySQL, users, со следующими столбцами:

  1. user_id (PK)
  2. Адрес электронной почты
  3. имя
  4. пароль

Для управления системой ролей, будет ли недостатком один из следующих вариантов?

Вариант 1:

Создайте вторую таблицу с именем roles с тремя столбцами: role_id (первичный ключ), name и description, затем свяжите users.user_id с roles.role_id как внешние ключи в третьей таблице с именем users_roles?

Или ...

Вариант 2:

Создать вторую таблицу с именем roles с двумя столбцами: user_id (внешний ключ от users.user_id) и role (ENUM)? Столбец типа данных ENUM позволил бы вставить короткий список допустимых ролей в качестве значений.

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

Ответы [ 2 ]

9 голосов
/ 02 июня 2010

Как правило, типы ENUM не предназначены для использования в этих ситуациях. Это особенно актуально в том случае, если вы намереваетесь обеспечить гибкость добавления или удаления ролей в будущем. Единственный способ изменить значения ENUM - использовать ALTER TABLE, в то время как для определения ролей в их собственной таблице просто потребуется новая строка в таблице roles.

Кроме того, использование таблицы roles позволяет добавлять дополнительные столбцы для более точного определения роли, например, поле description, которое вы предложили в варианте 1. Это невозможно, если вы использовали тип ENUM как в варианте 2.

Лично я не выбрал бы ENUM в этих сценариях. Может быть, я вижу, что они используются для столбцов с абсолютно конечным набором значений, таких как {Spades, Hearts, Diamonds, Clubs}, для определения масти карты, но не в таких случаях, как рассматриваемый, для недостатков, упомянутых ранее.

0 голосов
/ 07 марта 2014

Использование ENUM для предложенного вами случая имеет смысл, только если у вас есть строго определенный ORM на принимающей стороне, который для istance автоматически отображает строки БД в список плоских объектов.

Пример: табличное животное (ENUM(«Рептилии», «mamals») Категория, (varchar 50) Имя);

автоматически сопоставляется с

объектом животное животное-> Категория животное-> Имя

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