2009-07-22 3 views
4

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

Скажем, у меня есть таблица базы данных, которая выглядит следующим образом:

Table: Visibility 
Id Value 
-- ----- 
0 Visible 
1 Invisible 
2 Collapsed 

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

В моем переднем конце у меня есть выбор.

  1. Я мог бы запросить эту таблицу и сохраните его, скажем, Dictionary<string, int> или Dictionary<int, string>.
  2. Я могу написать перечисление вручную и просто вручную изменить значения в редком случае, если есть изменение в таблице. НАПРИМЕР,

    public enum Visiblity { Visible, Invisible, Collapsed }

  3. Что-то еще ????

Что бы вы посоветовали и почему?

Спасибо.

+0

«Я мог бы запросить эту таблицу и сохранить ее, скажем, в словаре или словаре». ??? 2 раза то же самое ??? – KdgDev

+0

@WebDevHobo, я исправлял его, когда вы комментировали :-P – devuxer

+0

Это точный дубликат http://stackoverflow.com/questions/876008/database-design-multiple-lookup-enum-tables-or-one- большой стол, который я нашел путем поиска http://stackoverflow.com/search?q=sql+enum около 2 минут. –

ответ

2

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

Некоторое дополнительное обоснование для этого: если по какой-то причине нужно было добавить четвертое значение, ваш код в любом случае нуждается в обновлении, чтобы иметь возможность справиться с этим. Пока вы на это, очень мало проблем, чтобы обновить перечисление.

1

В случае, если вам нужно добавить новое значение в таблицу, для этого потребуется изменение кода в приложении для поддержки этого нового значения? Если да, сделайте это enum.

0

Если у вас есть бизнес-логика, основанная на перечислении, то ваш основной вариант - синхронизация вручную. Если эти строки также являются внешними ключами для другой таблицы (скажем, у вас есть таблица поиска статусов), вы должны сделать тип ID регулярным int с уникальным индексом вместо Identity, чтобы вы могли легко поддерживать пары ID/Value то же самое, если у вас есть базы данных в разных средах.

1

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

1

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

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

+0

@Scott, интересный комментарий о генерации кода. Вы говорите, что генерируете перечисление во время выполнения на основе запроса таблицы db? Если да, есть ли у вас удобство? – devuxer

+0

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

+0

@Scott, ах, что-то похожее на SqlMetal.exe? – devuxer

0

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