Postgresql перечисляет, какие преимущества и недостатки?

Где я работаю, мы используем базу данных postgres (8.3 скоро для перехода на 8.4). В настоящее время существует небольшая дискуссия об использовании перечислений в базе данных. Лично мне не нравится тип перечисления db. Среди прочего он ставит логику приложения в базу данных и создает возможность для несоответствия между кодом и данными.

Мне было интересно, в чем преимущества преимуществ postgres enums (кроме чтения) и каковы недостатки?

Ответы

Ответ 1

Преимущества перечислений:

  • Производительность лучше. Вы можете просто отобразить то, что вы получаете из основной таблицы, вместо того, чтобы иметь отдельную таблицу поиска, которая преобразует код в значение или имеет логику приложения, которая преобразует код в значение. Это может быть особенно полезно в приложениях datawarehouse.
  • Специальный SQL легче писать

Недостатки:

  • Кодирование отображаемых значений в вашей базе данных ddl - плохая форма. Если вы переводите значение перечисления в другое отображаемое значение в вашем коде приложения, вы потеряли много преимуществ использования перечислений.
  • Добавление значений требует изменений DDL
  • затрудняет локализацию языка
  • Переносимость базы данных уменьшается

Ответ 2

Перечисления объединяют преимущества int с преимуществами строк: они маленькие и быстрые, такие как ints, читаемые как строки, и имеют дополнительное преимущество быть в безопасности (вы не можете неправильно использовать перечисление).

Однако, если вы не заботитесь о читаемости, int также хорош как перечисление.

Ответ 3

В качестве преимущества у вас также есть проверка БД, что ничто другое значение enum не может быть записано в столбце. Большим недостатком для меня было то, что enum можно было изменить только добавлением ценности до конца, но поскольку Postgres 9.1 это в прошлом: fooobar.com/questions/58527/...

Ответ 4

Точка, если приложениям разрешено делать DDL, они, скорее всего, вызовут блокировку или конфликт. DDL лучше всего делать автономно, то есть в однопользовательском режиме.