Mysql Datatype - Enum или не Enum, может ли Enum быть пустым? - PullRequest
12 голосов
/ 06 октября 2011

У меня большая БД (много миллионов строк), и я пытаюсь сделать лучший выбор для типов данных для 2 полей. Почти все, что я сделал, varchar или INT. Тем не менее, 2 поля мне интересно, если Enum лучший способ.

Поле 1 Первое поле - пол, мои данные в настоящее время либо «мужской», либо «женский», или это может быть пустой. Я изначально настроил это так:

GENDER VARCHAR(6) NOT NULL

Это лучший способ, или лучше установить его как:

GENDER ENUM ('Male', 'Female') NOT NULL

И нужно ли мне сделать так, чтобы значение NOT NULL учитывало пробел, или мне нужно добавить пробел, т.е.

GENDER ENUM ('Male', 'Female', '') NOT NULL

Не говоря уже о том, что я рассматриваю возможность преобразования всего поля в просто M или F.

Поле 2: У меня есть почти то же самое, за исключением поля состояния, которое может включать 52 значения (50 состояний, DC, плюс пробел).

Полагаю, самый большой вопрос - стоит ли весь этот материал Enum того? В моей базе данных много миллионов строк, так что все является фактором, но я должен просто использовать VARCHAR (2) для состояний вместо ENUM.

Ответы [ 2 ]

11 голосов
/ 06 октября 2011

Эмпирическое правило, которое я обычно применяю к таким случаям, НЕ должно использовать MySQL ENUM. Их использование создает проблемы с обслуживанием, особенно вокруг добавления / удаления / переименования некоторых значений. В InnoDB переименование и удаление значения перечисления тяжело для больших таблиц. Добавление значения не (если вы не добавите его в середине).

Поскольку вы, вероятно, хотите сохранить этот столбец в контексте и не допускать какого-либо значения из этого контекста, лучшим способом IMHO является использование INT и подключение его в качестве внешнего ключа к таблице значений (столбец id, значение).

Вы сможете легко добавлять и переименовывать значения в этой таблице, и, прежде чем удалить значение, FK принудительно обработает любые существующие записи в основной таблице, имеющие это значение.

Чтобы легко читать данные, все, что вам нужно, это просто JOIN.

Примечание: поскольку гендеры довольно важны, вы можете оставить это как VARCHAR (1) или использовать ENUM, как предлагает Йохан, но кто знает? Возможно, вы захотите поддержать трансгендеров и андрогинность в будущем. Без шуток.

7 голосов
/ 06 октября 2011

Если вы хотите иметь значение для no value entered, используйте null, для этого и предназначена null!

Если вы хотите указать что-то среднее между мужчиной и женщиной (это условие есть у нескольких несчастных людей), используйте

ENUM('male','female','neither') NULL;

Обратите внимание, что перечисление не storeбуквенное текстовое значение в столбце.
male сохраняется как 1, female как 2 и neither как 3 и т. д.
Это означает, что оно намного более эффективно, чем varchar.

Если вы боретесь с null при выборе, обратите внимание, что вы можете использовать функции ifnull или coalesce, чтобы заменить null чем-то более полезным.

SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...