Какой тип данных вы используете для перечислений в SQL Server

Когда мы сериализуем перечисление из C# в SQL Server, мы используем тип данных NCHAR(3) с мнемоническими значениями для каждого значения перечисления. Таким образом, мы можем легко прочитать запрос SELECT.

Как вы сохраняете enum в своей базе данных?

Какой тип данных вы используете?


person pkario    schedule 16.12.2008    source источник


Ответы (7)


Лучшим способом было бы сохранить как int. Таким образом, вы можете десериализовать/перевести из БД обратно в правильное значение перечисления.

Если перечисление может быть изменено в будущем, используйте явные значения, например.

public enum ActionType
{
  Insert = 1,
  Update = 2,
  Delete = 3
}

Практичность хранения в качестве мнемоники должна вызывать конфликты в зависимости от вашего алгоритма генерации мнемоники?

person Kev    schedule 16.12.2008
comment
Раньше так делал. Запросы становятся трудными для понимания по мере усложнения базы данных. Наборы результатов трудно интерпретировать без множества внутренних соединений. Точно такая же причина для использования перечислений, а не целых чисел в С# - person pkario; 18.12.2008
comment
Вы говорите, что каждое значение перечисления само по себе является мнемоникой? например ActionType.Ins, ActionType.Upd и т. д.? - person Kev; 18.12.2008

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

person Martin Brown    schedule 16.12.2008

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

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

person recursive    schedule 16.12.2008

Я храню их как целые числа. это действительно симпатичное приведение их друг к другу (int) enum и (enum) int :) также мой другой любимый - dropdownlist.datasource = Enum.GetNames(typeof(EnumType));

Это слишком примитивно, ведь вы говорите о множестве сложных вещей?

person Community    schedule 16.12.2008

nchar(3) для мнемоники?

Как указал Мартин, используйте таблицу поиска с INT как PK, идентификатором VARCHAR как UK и описанием NVARCHAR.

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

Таким образом, значения задокументированы как в базе данных, так и в исходном коде C#.

person devio    schedule 16.12.2008

Вот мой ответ в другой теме.

На мой взгляд, лучший способ - использовать таблицу поиска с int, как было предложено выше, но комбинируя ее с генерацией кода, чтобы придерживаться принципа DRY (не повторяйтесь).

Вот ссылка для генерации кода пример.

person Jony Adamit    schedule 01.08.2012

Это не так. Есть расплывчатый эквивалент:

Жанр VARCHAR(10) NOT NULL CHECK (Жанр IN('Мужской', 'Женский', 'Другие'))

person Julião Joaquim    schedule 07.08.2017