Неявные перечисляемые типы (т. Е. Символы) в SQL - PullRequest
2 голосов
/ 26 января 2011

Мы часто используем VARCHAR для существенно перечисляемых значений.Я знаю, что было бы разумно извлечь их в отдельную таблицу поиска и использовать целочисленный идентификатор в качестве внешнего ключа, но иногда никакая другая таблица не использует его, и нам не нужен еще один JOIN, поэтому мы решили оставить их вглавная таблица.

Итак, вопрос в том, есть ли какая-либо особенность БД, которая позволила бы мне отмечать такие столбцы, а затем использовать некоторую внутреннюю справочную таблицу, чтобы сэкономить место и повысить производительность моих запросов?Нечто подобное Postgres ' ENUMs , но это не потребует явного объявления возможных значений заранее.

Например, я хотел бы сделать INSERT:

INSERT INTO table (date, status) VALUES ('2011-01-25', 'pending');

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

В некоторых языках программирования (LISP, Ruby),подобная функция называется символами , де-факто "именованными целыми числами".

В основном меня интересуют Postgres и MySQL, но любые другие указатели также приветствуются.

Ответы [ 2 ]

1 голос
/ 26 января 2011

Сжатие таблиц Oracle и сжатие страниц SQL Server делают это в дополнение к другим трюкам.Хорошая особенность использования встроенных подпрограмм сжатия заключается в том, что они полностью прозрачны - в вашем коде не требуется никаких дополнительных объединений, а из-за меньшего доступа к диску доступ к сжатым часто быстрее, чем к несжатому.Я думаю, что Postgres делает это как часть TOAST , когда он использует стратегию хранения EXTERNAL, но только на больших полях.

0 голосов
/ 27 января 2011

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

е:

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_getConst('statuscode','pending'));

или

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_Const_StatusCode_Pending());

Если вы используете константу в нескольких местах в запросе, сначала попробуйте выбрать ее в переменной.

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

...