Tomemos otro ejemplo que esté menos cargado de concepciones y expectativas. Tengo una enumeración aquí, y es el conjunto de prioridades para un error.
¿Qué valor está almacenando en la base de datos?
Por lo tanto, podría estar almacenando 'C'
, 'H'
, 'M'
, y 'L'
en la base de datos. O 'HIGH'
y así sucesivamente. Esto tiene el problema de los datos de tipo cadena . Existe un conjunto conocido de valores válidos, y si no está almacenando ese conjunto en la base de datos, puede ser difícil trabajar con él.
¿Por qué está almacenando los datos en el código?
Tienes List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
o algo por el estilo en el código. Significa que tiene varias asignaciones de estos datos al formato adecuado (está insertando todas las mayúsculas en la base de datos, pero las está mostrando como Critical
). Su código ahora también es difícil de localizar. Ha vinculado la representación de la base de datos de la idea a una cadena que se almacena en el código.
En cualquier lugar donde necesite acceder a esta lista, debe tener duplicación de código o una clase con un montón de constantes. Ninguno de los cuales son buenas opciones. Tampoco se debe olvidar que hay otras aplicaciones que pueden usar estos datos (que pueden estar escritos en otros idiomas: la aplicación web Java tiene un sistema de informes Crystal Reports utilizado y un trabajo por lotes de Perl que introduce datos). El motor de informes necesitaría conocer la lista válida de datos (¿qué sucede si no hay nada marcado en 'LOW'
prioridad y necesita saber que esa es una prioridad válida para el informe?), Y el trabajo por lotes tendría la información sobre cuál es el valor válido los valores son
Hipotéticamente, podría decir "somos una tienda de un solo idioma, todo está escrito en Java" y tenemos un único .jar que contiene esta información, pero ahora significa que sus aplicaciones están estrechamente unidas entre sí y que contiene .jar los datos. Deberá liberar la parte de informes y la parte de actualización por lotes junto con la aplicación web cada vez que haya un cambio, y esperar que esa versión se realice sin problemas para todas las partes.
¿Qué sucede cuando tu jefe quiere otra prioridad?
Tu jefe vino hoy. Hay una nueva prioridad - CEO
. Ahora tiene que ir y cambiar todo el código y volver a compilar y volver a implementar.
Con un enfoque de 'enumeración en la tabla', actualiza la lista de enumeraciones para tener una nueva prioridad. Todo el código que obtiene la lista la extrae de la base de datos.
Los datos rara vez están solos
Con las prioridades, las claves de datos en otras tablas que pueden contener información sobre los flujos de trabajo, o quién puede establecer esta prioridad o no.
Volviendo al género como se menciona en la pregunta por un momento: el género tiene un enlace a los pronombres en uso: he/his/him
y she/hers/her
... y desea evitar codificarlo en el propio código. Y luego aparece tu jefe y debes agregar que tienes el 'OTHER'
género (para simplificarlo) y debes relacionar este género con they/their/them
... y tu jefe ve lo que Facebook tiene y ... bueno, sí.
Al restringirse a un bit de datos de tipo secuencial en lugar de una tabla de enumeración, ahora necesita replicar esa secuencia en un montón de otras tablas para mantener esta relación entre los datos y sus otros bits.
¿Qué pasa con otros almacenes de datos?
No importa dónde almacene esto, existe el mismo principio.
- Podría tener un archivo
priorities.prop
que tenga la lista de prioridades. Usted lee esta lista desde un archivo de propiedades.
Podría tener una base de datos del almacén de documentos (como CouchDB ) que tenga una entrada para enums
(y luego escribir una función de validación en JavaScript ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Podría tener un archivo XML con un poco de esquema:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
La idea central es la misma. El almacén de datos en sí es donde la lista de valores válidos debe almacenarse y aplicarse. Al colocarlo aquí, es más fácil razonar sobre el código y los datos. No tiene que preocuparse por verificar a la defensiva lo que tiene cada vez (¿en mayúsculas o minúsculas? ¿Por qué hay un chritical
tipo en esta columna? Etc ...) porque sabe lo que está obteniendo del almacén de datos. exactamente lo que el almacén de datos espera que envíe de lo contrario, y puede consultar el almacén de datos para obtener una lista de valores válidos.
La comida para llevar
El conjunto de valores válidos son datos , no códigos. Usted no tiene que luchar por la SECO código - pero la cuestión de la duplicación es que se está duplicando los datos en el código, en lugar de respetar su lugar como los datos y su almacenamiento en una base de datos.
Facilita la escritura de múltiples aplicaciones en el almacén de datos y evita tener instancias en las que necesitará implementar todo lo que esté estrechamente vinculado a los datos en sí, porque no ha acoplado su código a los datos.
Hace que las aplicaciones de prueba sean más fáciles porque no tiene que volver a probar toda la aplicación cuando CEO
se agrega la prioridad, porque no tiene ningún código que se preocupe por el valor real de la prioridad.
Ser capaz de razonar sobre el código y los datos independientemente uno del otro hace que sea más fácil encontrar y corregir errores al realizar tareas de mantenimiento.