Intenté resumir mi comprensión. Siéntase libre de editar esto si tiene alguna corrección. Así que aquí va:
En el código
En el código, las enumeraciones deben manejarse usando el tipo de enumeración nativo del lenguaje (al menos en Java y C #), o usando algo como el "patrón de enumeración de tipo seguro" . Se desaconseja el uso de constantes simples (Integer o similar), ya que se pierde la seguridad de los tipos (y se dificulta la comprensión de qué valores son entradas legales para, por ejemplo, un método).
La elección entre estos dos depende de cuánta funcionalidad adicional se adjuntará a la enumeración:
- Si desea poner un montón de funcionalidad en la enumeración (lo cual es bueno, porque evita cambiar () en todo el tiempo), una clase suele ser más apropiada.
- Por otro lado, para valores simples de tipo enumeración, la enumeración del lenguaje suele ser más clara.
En particular, al menos en Java una enumeración no puede heredar de otra clase, por lo que si tiene varias enumeraciones con un comportamiento similar que le gustaría poner en una superclase, no puede usar las enumeraciones de Java.
Enumeraciones persistentes
Para conservar las enumeraciones, a cada valor de enumeración se le debe asignar un ID único. Puede ser un número entero o una cadena corta. Se prefiere una cadena corta, ya que puede ser nemotécnica (facilita que los DBA, etc. comprendan los datos sin procesar en la base de datos).
- En el software, cada enumeración debería tener funciones de mapeo para convertir entre la enumeración (para usar dentro del software) y el valor de ID (para persistir). Algunos marcos (por ejemplo, (N) Hibernate) tienen un soporte limitado para hacer esto automáticamente. De lo contrario, debe ponerlo en el tipo / clase de enumeración.
- La base de datos debería (idealmente) contener una tabla para cada enumeración que enumere los valores legales. Una columna sería el ID (ver arriba), que es el PK. Las columnas adicionales pueden tener sentido para, por ejemplo, una descripción. Todas las columnas de la tabla que contendrán valores de esa enumeración pueden usar esta "tabla de enumeración" como FK. Esto garantiza que los valores de enumeración incorrectos nunca puedan persistir y permite que la base de datos "se sostenga por sí misma".
Un problema con este enfoque es que la lista de valores legales de enumeración existe en dos lugares (código y base de datos). Esto es difícil de evitar y, por lo tanto, a menudo se considera aceptable, pero hay dos alternativas:
- Solo mantenga la lista de valores en la base de datos, genere el tipo de enumeración en el momento de la compilación. Elegante, pero significa que se requiere una conexión de base de datos para que se ejecute una compilación, lo que parece problemático.
- Defina la lista de valores en el código para que tenga autoridad. Verifique los valores en la base de datos en tiempo de ejecución (generalmente al inicio), reclame / anule si no coincide.