2009-03-03 2 views
5

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

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

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

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

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

ответ

10

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

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

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

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

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

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

2

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

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

Смежные вопросы