Comencé a trabajar en una nueva organización y uno de los patrones que he estado viendo en la base de datos es duplicar campos para facilitar la escritura de consultas para los analistas de negocios. Estamos usando Django y su ORM.
En un caso, mantenemos un objeto MedicalRecordNumber con una cadena única que identifica a un paciente en un determinado contexto. Tenemos objetos de registro que rastrean a los pacientes y tienen números de registro médico asociados , pero en lugar de usar una relación de clave externa, duplican la cadena para evitar escribir una unión ( no por razones de rendimiento). Este patrón es común en toda la base de datos.
Para mí, la importancia de que un modelo de datos esté limpio es solo para poder pensarlo bien. La complejidad innecesaria es una pérdida de mi tiempo limitado de procesamiento cognitivo. Es un problema sistemático. No sentirse cómodo escribiendo uniones es un problema de habilidades rectificables. No necesariamente quiero abogar por volver y cambiar el esquema, pero me encantaría poder articular de manera convincente los problemas con este tipo de duplicación.
fuente
Respuestas:
Su base de datos operativa debe estar altamente normalizada, para reducir anomalías .
Su base de datos analíticos (almacén) debe estar altamente desnormalizada, para facilitar el análisis.
Si no tiene una base de datos analítica separada, debe hacer algunas vistas altamente materializadas [materializadas].
Si le dice a sus analistas / gerentes de negocios senior que hagan muchas uniones para un análisis simple, bueno, podría ser despedido.
Agile Data Warehouse Design es un buen libro
Vea mis consejos rápidos de almacenamiento de datos sucios aquí
fuente
Entiendo por qué alguien quiere evitar escribir una unión para cada selección.
Pero puede crear una vez una vista con la unión y usarla en lugar de su tabla no normalizada.
Por lo tanto, combina la ventaja de la normalización con la comodidad de una selección fácil.
fuente
Las respuestas que ya se han votado más o menos cubren "cómo evitar la duplicación" (usando vistas) pero no el por qué. Básicamente muestran que la duplicación de columnas es la solución incorrecta al problema de facilitar la escritura de consultas. Pero la pregunta "¿por qué no duplicar ninguna columna aleatoria solo por el gusto de hacerlo?" sigue en pie.
La respuesta es "Debido a la Ley de Murphy". La ley de Murphy establece que:
En este caso, se supone que el contenido de cada campo de fila de una columna duplicada es idéntico al contenido de cada campo de fila correspondiente de la columna original. Lo que puede salir mal es que el contenido de algunos campos de fila puede diferir de los originales, causando estragos. Se podría pensar que usted ha tomado todas las precauciones imaginables para asegurarse de que no van a ser diferentes, pero la ley de Murphy señala que debido a que pueden ser diferentes, van a ser diferentes. Y se producirán estragos .
Como ejemplo de cómo puede suceder esto, simplemente considere el hecho de que las columnas duplicadas no se llenan de magia; alguien debe escribir un código que almacene valores en ellos cada vez que se crean filas en la tabla original, y alguien debe escribir un código que los actualice siempre que se modifiquen los originales. Dejando a un lado el hecho de que esto está agregando una carga indebida al código que ingresa datos en la base de datos (y que, por definición, es mucho más crucial que cualquier código que simplemente consulta la base de datos), alguien, en algún lugar, en ciertas circunstancias, podría olvidar para llevar a cabo esta duplicación. Entonces, los valores serán diferentes. O pueden recordar llevar a cabo la duplicación, pero no dentro de una transacción, por lo que, bajo ciertas condiciones de fallas raras, puede omitirse. Pero en realidad no necesitaba perder el tiempo escribiendo estos ejemplos,si puede salir mal, lo hará.
fuente
Pensarlo en términos de compensaciones en lugar de buenas / malas será más productivo. Están intercambiando las ventajas de la normalización (especialmente la coherencia) por ventajas en la usabilidad de consultas.
En un extremo, la base de datos se volvería inútil si los datos se volvieran severamente inconsistentes. En el otro extremo, la base de datos sería inútil si es demasiado difícil para las personas que necesitan consultarla todos los días para obtener resultados con los que puedan contar.
¿Qué puede hacer para reducir los riesgos y los costos?
fuente
Creo que el argumento más sólido para la normalización de datos para los analistas de negocios es que promueve la integridad de los datos. Si sus datos clave se almacenan en un solo lugar (una columna, en una tabla), es mucho menos probable que los datos se corrompan por actualizaciones incorrectas. Creo que probablemente les importaría la importancia de la integridad de los datos, por lo que esta podría ser una buena manera de convencerlos de actualizar sus formas de interactuar con la base de datos.
Es probable que un método de consulta un poco más difícil sea preferible a la posible corrupción de datos.
fuente
Para agregar a lo que los otros chicos han sugerido anteriormente. Este es un problema de gobernanza de datos. Debe trabajar con las partes interesadas relevantes: arquitectos de datos y administradores de datos para desarrollar principios de datos, políticas y convenciones de denominación.
Sea paciente y trabaje metódicamente. El cambio no sucederá de la noche a la mañana.
fuente
Dejar.
Honestamente, puede pasar meses discutiendo sobre la normalización, la coherencia y la lucha contra los errores locos causados por la pereza, y luego dejar de fumar.
O simplemente puede ahorrar tiempo, frustración y renunciar ahora.
Los buenos programadores son personas muy vagas. Entienden las necesidades de los clientes y la administración. Pero lo más importante es que entienden que resolver bien los problemas, usar soluciones bien diseñadas y bien implementadas les ahorra personalmente ENORMES cantidades de trabajo, esfuerzo y, lo más importante, agonía y estrés.
Por lo tanto, sería mucho mejor trabajar en un lugar que comprenda y valore la buena ingeniería.
Buena suerte.
Pensamiento posterior: Quizás lo que necesitan son herramientas de BI / OLAP ... http://en.wikipedia.org/wiki/Online_analytical_processing
fuente