Estoy haciendo un programa que publicará datos en una base de datos, y me he encontrado con un patrón que estoy seguro es familiar: una breve tabla de valores fijos más probables (muy probables) que sirven como enumeración. Supongamos que la siguiente tabla se llama Status
:
Estado ID Descripción -------------- 0 sin procesar 1 pendiente 2 procesados 3 error
En mi programa, necesito determinar un Id. De estado para otra tabla, o posiblemente actualizar un registro con un nuevo Id. De estado.
Podría codificar los identificadores de estado en una enumeración y espero que nadie cambie la base de datos. O podría buscar previamente los valores en función de la descripción (por lo tanto, codificar eso ).
¿Cuál sería el enfoque correcto para mantener estos dos, enum y table, sincronizados?
Respuestas:
Codificaría la enumeración dentro de su programa, ya que sospecho que estos diferentes estados afectan la lógica de sus programas. Si tiene un nuevo estado, ¿cómo se supone que su programa reaccionará a este nuevo estado?
Debido a que la base de datos es parte de su aplicación, no creo que tenga sentido afectar una sin consultar a otra, más o menos.
fuente
pending
sería la ID . Por supuesto, tener unaStatus
mesa te da integridad referencial, pero eso es lo que quiero decir.Status
tabla no debe considerarse dinámica durante el tiempo de ejecución de la aplicación y, por lo tanto, no creo que deba leerla como tal.Normalmente cargaría estos datos en un caché estático (generalmente en un HashMap o algo así) cuando se inicia la aplicación. Evita tener que volver a compilar solo porque la enumeración se ha modificado de alguna manera.
fuente
Debido a que esos son estados, deben estar codificados en la aplicación para garantizar que ningún cambio en la base de datos corromperá su programa (al menos no fácilmente). Esto es importante porque cada estado que debe agregarse debe codificarse primero y no simplemente agregarse a la base de datos.
Aún debe tener esos valores de estado escritos en la base de datos con sus descripciones correctas en caso de que necesite extraer un informe, por ejemplo.
Por lo general, tengo un pequeño fragmento de código que se conectará a la base de datos y verificará que los estados enumerados en una tabla específica tengan todos los mismos valores de identificación / nombre que he codificado en la memoria. Si no coinciden, abortaré la ejecución del software.
Dependiendo de sus necesidades, es posible que desee implementar comportamientos ligeramente diferentes, pero en general es una buena idea tener esos estados codificados de todos modos.
fuente
Tenemos problemas similares en mi proyecto (código heredado, ¡hurra!) El problema principal es que "las tablas de enumeración nunca cambian" hasta que lo hacen y el código se rompe. Tengo dos estrategias para mitigar hacia las que he estado migrando lentamente.
Primero, y lo mejor, es eliminar las referencias directas a estos valores siempre que sea posible. Siempre pregunte, "¿por qué necesito usar directamente el valor enum?" En muchos casos, esto es una señal de que el código tiene demasiados supuestos codificados o está tratando de manipular demasiado los datos. Vea si no puede establecer mejores relaciones en la base de datos o un código más flexible para manejar lo que se está manipulando.
Cuando eso no funciona, voy al plan B: generación de código. Dado que las tablas cambian con poca frecuencia y publicamos nuevas compilaciones regularmente, un generador de código puede leer las tablas de enumeración y escribir el código de enumeración. Esta biblioteca generada dinámicamente se utiliza en el proyecto. Si la base de datos cambia, la próxima compilación no se compilará, lo cual es mucho mejor que obtener misteriosos errores de tiempo de ejecución.
fuente