Почему vbulletin использует ENUM? - PullRequest
1 голос
/ 19 июля 2011

Сегодня у меня были некоторые споры с моим коллегой о выборе типов данных в наших проектах.Мы веб-разработчики, и мы кодируем back-end на PHP, а для базы данных мы используем mySQL.Итак, я немного побывал в интернете, и они не рекомендуют тип данных ENUM по разным причинам (также я читал здесь о SO, что это не рекомендуется) - например, для ENUM («да», «нет»)Вы должны использовать tinyint (1).Если ENUM плохие и их следует избегать, почему, например, vBulletin их использует?Зачем вообще их использовать, если вы можете использовать VARCHAR, TEXT и т. Д. И принудительно использовать 1 из 2 возможных значений в PHP.Спасибо за ваши ответы.

1 Ответ

3 голосов
/ 19 июля 2011

Перечисления не идеальны, но они waaaay лучше, чем ваше альтернативное предложение использовать VARCHAR и использовать одно из нескольких возможных значений!

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

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

Решение этой проблемы - использовать связанную таблицу, котораяхранит список возможных значений, и ваше исходное поле теперь будет просто содержать ссылку на идентификатор вашей новой таблицы, а запросы сделают соединение с таблицей поиска, чтобы получить строковое значение.Это называется «нормализацией» и считается хорошей практикой работы с базами данных.Это классический сценарий реляционной базы данных с большим количеством этих справочных таблиц.

Очевидно, что если вы достаточно уверены, что поле никогда не будет хранить ничего, кроме «да» или «нет», то это может бытьИзлишне иметь целую дополнительную таблицу для нее, и может быть уместно перечисление.

Некоторые продукты баз данных даже не предоставляют тип данных enum, поэтому, если вы используете эти БД, вы вынуждены использоватьрешение таблицы поиска (или просто простое числовое поле и сопоставление значений в вашем приложении).

Что никогда уместно в этой ситуации, это использовать фактическое строковое значение в таблице,Это считается крайне плохой практикой.

VARCHARS занимают гораздо больше места на диске, чем числовые значения, используемые перечислением.Их также медленнее читать и медленнее искать в запросе.Кроме того, они снимают принудительное применение фиксированных значений, предусмотренных enum.Это означает, что ошибка в вашей программе может привести к тому, что в данные попадут недопустимые значения, а также может произойти непреднамеренное обновление с использованием PHPMyAdmin или аналогичного инструмента.

Надеюсь, это поможет.

...