Сохранение Enums в виде байта или текста в базу данных

Я не могу принять однозначное решение по этому вопросу.

Я в порядке, имея числовые значения в своих таблицах и информацию о значениях в описании столбца в базе данных для DBA.

Но я также не хочу в будущем дойти до точки, когда наличие этих числовых значений в базе данных создаст слишком много головной боли для обслуживания.

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

Не могли бы вы поделиться своими мыслями из вашего многолетнего опыта. Спасибо


person kaivalya    schedule 07.09.2009    source источник
comment
Похоже, что этот вопрос был задан (и на него дан ответ) несколько часов назад: stackoverflow.com/questions/1390697/sql-table-and-c-enumeration Марк   -  person marc_s    schedule 08.09.2009


Ответы (1)


Стандартный способ справиться с вашей ситуацией — использовать таблицы поиска. Как правило, они имеют простую структуру (часто всего два столбца):

CREATE TABLE LookupTable
(
    code    SMALLINT NOT NULL PRIMARY KEY,
    name    VARCHAR(32) NOT NULL
);

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

CREATE TABLE ReferencingTable
(
    ...
    lookup   SMALLINT NOT NULL REFERENCES LookupTable,
    ...
);

Здесь я не очень умен с именами; вы можете использовать «CustomerStatus» вместо «LookupTable», а затем использовать имя столбца CustStatus в ReferencingTable. Вы можете выбрать различные типы для столбца «код» — крошечное однобайтовое целое число, маленькое поле CHAR или INTEGER, в зависимости от того, сколько значений вам может понадобиться. Иногда таблица поиска становится более сложной и также приобретает дополнительные атрибуты, описывающие сущность, хотя обычно это означает, что она моделирует сущность, имеющую некоторое значение для вашей БД, и больше не является «просто таблицей поиска».

Вы можете получить довольно много таких справочных таблиц, но не поддавайтесь искушению попасть в ловушку обобщения до идиомы «Единая истинная справочная таблица» (OTLT). Как описано в других вопросах SO и в других местах в Интернете, это приводит к проблемам с целостностью данных.

person Jonathan Leffler    schedule 07.09.2009
comment
LookupTable Может быть LookupSTable с полем EnumName. - person Burnsys; 19.09.2009