Перечисление таблиц в Hibernate / NHibernate - PullRequest
5 голосов
/ 03 марта 2009

Мы используем NHibernate, и один из распространенных шаблонов хранения информации, подобной перечисляемой, - это определение отдельных таблиц для перечисления и просто указание идентификатора в основной сущности / таблице, которая использует перечисление. Простой пример:

Message
-------
ID (bigint PK)
MessageTypeID (bigint FK)
Body (varchar)

MessageType
-----------
ID (bigint PK)
Value (varchar)

Таблица MessageType содержит небольшое количество перечисляемых значений, таких как: SMS, MMS, PSMS и т. Д.

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

Ответы [ 2 ]

10 голосов
/ 03 марта 2009

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

В обоих случаях вы можете добавить больше опций, но вопрос в следующем: если вы добавите еще один элемент в таблицу, вам понадобится перекомпилировать приложение, чтобы добавить такую ​​функцию?

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

С другой стороны, если вашей сущности не хватает логики (например, таблицы «Страны» или «Состояния») или ваше приложение может подключить новый тип сообщения без перекомпиляции, вам следует использовать другую таблицу. Для этого вы можете изменить свой стол на что-то вроде этого:

MessageType
-----------
ID (bigint PK)
Value (varchar)
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz)

Или у вас может быть отдельный файл конфигурации, в котором вы можете настроить введенные зависимости.

2 голосов
/ 03 марта 2009

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

Я отклонился от таблиц enum, особенно когда эти данные не требуют управляемых данных. Собираетесь ли вы добавлять все больше и больше MessageType по мере продвижения?

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