2009-03-03 16 views
5

Estamos usando NHibernate, y uno de los patrones comunes que tenemos para almacenar información enum es definir tablas separadas para la enumeración, y simplemente hacer una referencia a la ID en la entidad principal/tabla que usa la enumeración. Un ejemplo sencillo:Tablas de Enum en Hibernate/NHibernate

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

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

La tabla MessageType contiene un pequeño número de valores de enumeración como: SMS, MMS, PSMS, etc.

¿Vale la pena poner los valores de enumeración en tablas separadas de este tipo? Creo que el profesional de la enumeración es que puedes extenderla más fácilmente en el futuro y está más normalizada, pero la desventaja es que tienes que unirte cada vez que traes un Mensaje. ¿Hay un punto de quiebre donde elegirías uno sobre el otro?

Respuesta

10

Usar enums implica no usar otra tabla como lo está haciendo en este momento. También es más rápido como dijiste y mucho más simple.

En ambos casos, puede agregar más opciones, pero la pregunta es: si agrega otro elemento en la tabla, ¿tendrá que volver a compilar la aplicación para agregar dicha función?

Quiero decir, si el diseño de su aplicación está acoplado y admite un nuevo tipo de mensaje, necesita recompilar (tal vez porque necesita incluir la implementación de SMS), no vale la pena tener una tabla separada, y debería usar enums

Por otro lado, si su entidad carece de lógica (como una tabla de Países o Estados), o su aplicación puede agregar un nuevo tipo de mensaje sin recompilar, debe usar otra tabla. Para esto, se podía cambiar su mesa para algo como esto:

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

o podría tener un archivo de configuración separada, donde puede personalizar las dependencias inyectados.

2

Crearía una enumeración en su código con Id. Correspondiente a su tabla MessageType. Luego, en sus clases solo use eso y nHibernate debería poder mapearlo apropiadamente.

Me he estado extraviando de las tablas enum, especialmente cuando esos datos no necesitan ser gestionados. ¿Vas a agregar cada vez más MessageType a medida que avanzas?