Тип MySQL ENUM по сравнению с объединяющими таблицами

TL; DR answer

С очень мало исключений это правило является золотым:

Избегайте использования !

Объявить переменную опциональную (?), а не неявно разворачиваемые опции (IUO) (!)

Другими словами, скорее используйте: var nameOfDaughter: String?

Вместо: var nameOfDaughter: String!

Исключить необязательную переменную с помощью if let или guard let

Либо разверните переменную, как это:

if let nameOfDaughter = nameOfDaughter {
    print("My daughters name is: \(nameOfDaughter)")
}

Или вот так:

guard let nameOfDaughter = nameOfDaughter else { return }
print("My daughters name is: \(nameOfDaughter)")

Этот ответ должен был быть кратким, для полного понимания прочитал принятый ответ

56
задан informatik01 19 December 2013 в 22:28
поделиться

4 ответа

  • Изменение набора значений в ПЕРЕЧИСЛЕНИИ требует ALTER TABLE, который мог бы вызвать таблицу, реструктурируют - невероятно дорогая операция (таблица реструктурируют, не происходит, если Вы просто добавляете одно новое значение до конца ПЕРЕЧИСЛИМОГО определения, но если Вы удаляете один или изменяете порядок, это делает таблицу, реструктурируют). Принимая во внимание, что Изменение набора значений в таблице поиска так просто, как ВСТАВЛЯЮТ или УДАЛЯЮТ.

  • нет никакого способа связать другие атрибуты со значениями в ПЕРЕЧИСЛЕНИИ, как то, которые ликвидированы, и которые имеют право быть помещенными в выпадающий список в Вашем пользовательском интерфейсе. Однако таблица поиска может включать дополнительные столбцы для таких атрибутов.

  • очень трудно запросить ПЕРЕЧИСЛЕНИЕ для получения списка отличных значений, в основном требуя, чтобы Вы запросили определение типа данных от INFORMATION_SCHEMA, и парсинг списка из возвращенного BLOB. Вы могли попробовать SELECT DISTINCT status от Вашей таблицы, но который только получает использующиеся в настоящее время значения состояния, который не мог бы быть всеми значениями в ПЕРЕЧИСЛЕНИИ. Однако, если Вы сохраняете значения в таблице поиска, легко запросить, отсортировать, и т.д.

я не большой поклонник ПЕРЕЧИСЛЕНИЯ, как можно сказать.:-)

то же относится к ограничениям CHECK, которые просто сравнивают столбец с фиксированным набором значений. Хотя MySQL не поддерживает ограничения CHECK так или иначе.

Обновление: MySQL 8.0.16 теперь реализует ограничения CHECK .

95
ответ дан Bill Karwin 26 November 2019 в 17:17
поделиться

Перечисления в mysql плохи по уже объясненным причинам.
я могу добавить следующий факт: Перечисление не гарантирует вида проверки на стороне сервера. Если Вы вставите строку со значением, которое не выходит в перечислимом определении, Вы получите хорошее или Нулевое значение в DB, в зависимости от ПУСТОЙ способности перечислимого объявления поля.

Моя точка о tinyints:
- перечисления ограничены 65 535 значениями
- если Вам не будут нужны больше чем 256 значений, то tinyint займет меньше места для каждой строки, и ее поведение является намного большим количеством "predictible".

7
ответ дан MatthieuP 26 November 2019 в 17:17
поделиться

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

Как оптимизация, это, вероятно, очень преждевременно; но OP главным образом предлагает его как удобную функцию так или иначе.

См. также http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

-1
ответ дан dkretz 26 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: