Pregunta

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

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

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

La tabla MessageType contiene una pequeña cantidad de valores de enumeración como: SMS, MMS, PSMS, etc.

¿Vale la pena poner los valores de enumeración en tablas separadas como esta? Supongo que el pro de la enumeración es que puede extenderlo más fácilmente en el futuro y está más normalizado, pero la desventaja es que tiene que hacer una combinación cada vez que busque un mensaje. ¿Hay un punto de ruptura en el que elegirías uno sobre el otro?

¿Fue útil?

Solución

El uso de enums implica no usar otra tabla como lo está haciendo ahora. También es más rápido como has dicho y mucho más sencillo.

En ambos casos, puede agregar más opciones, pero la pregunta es: si agrega otro elemento en la tabla, ¿necesitará recompilar la aplicación para agregar dicha característica?

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

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

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

O podría tener un archivo de configuración separado, donde puede personalizar las dependencias inyectadas.

Otros consejos

Me gustaría crear una enumeración en su código con el ID correspondiente a su tabla de MessageType. Luego, en sus clases, use eso y nHibernate debería poder mapearlo correctamente.

He estado alejándome de las tablas de enumeración, especialmente cuando esos datos no necesitan ser datos administrados. ¿Vas a agregar más y más MessageType a medida que avanzas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top