2011-01-26 4 views
2

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

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

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

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

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

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

Меня интересуют только Postgres и MySQL, но любые другие указатели будут оценены.

ответ

1

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

+0

Спасибо, ты дал мне правильные ключевые слова для дальнейшего поиска! Прозрачность - это то, что я имел в виду. И хотя сжатие страниц работает на более низком уровне, чем я ожидал, точка одна и та же. –

0

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

т.е.

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()); 

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

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

+0

Спасибо, это была бы более дешевая версия того, что мне нужно. UDF может выполнять INSERT, если константа еще не находится в словаре. Проблема в том, что логика в запросе усложняется, особенно если во многих местах используется одна и та же таблица и столбец. –