¿Tiene sentido estandarizar la inclusión de una fecha de creación y el último campo de fecha actualizado en todas las tablas de base de datos?

38

Mi jefe actualmente está tratando de aplicar algunos estándares de desarrollo a nuestro equipo, por lo que tuvimos una reunión ayer para discutir los estándares que en su mayoría iban bien hasta que ella mencionó:

  • Todas las tablas de base de datos tendrán una columna CreatedDate y LastUpdatedDate, actualizada por disparadores.

En este punto, nuestro equipo sufrió un cisma de opinión; la mitad de nosotros cree que hacer esto en todas las mesas es una gran cantidad de trabajo con poco beneficio (trabajamos en proyectos de presupuesto fijo, por lo que cualquier costo proviene de las ganancias de nuestra empresa); La segunda mitad cree que ayudará con el apoyo de los proyectos.

Estoy firmemente en el antiguo campamento. Si bien aprecio que algunos casos externos causarían que las columnas adicionales mejoren la capacidad de soporte, en mi opinión, la cantidad de trabajo que se requeriría para agregar las columnas en primer lugar, así como el mantenimiento, nos obligaría a dedicar menos tiempo a más cosas importantes como pruebas de unidad o carga. Además, estoy bastante seguro de que estas columnas adicionales harán que sea más incómodo usar un ORM, teniendo en cuenta que usamos principalmente C # y Oracle, que no es muy feliz para ORM.

Entonces, mi pregunta es doble:

  • ¿Estoy en el campamento correcto? No pretendo tener habilidades de base de datos de renombre mundial, por lo que esta podría ser una adición trivialmente fácil sin efectos secundarios adversos.
  • ¿Cómo lidiaría con una situación en la que una reunión sobre estándares se convierte en un partido de escorias? ¿Cómo puedo realmente vender que este estándar no nos va a ayudar a largo plazo?
Ed James
fuente
¿Por qué dices que C # no está satisfecho con ORM? Además, agregar las propiedades [insert = "false" update = "false" generó = "always"] al mapeo de estas dos columnas en NHibernate, por ejemplo, ¿no me parece incómodo o me falta algo?
Jalayn
C # + Oracle no está satisfecho con ORM, y descubrimos que NHibernate era demasiado pesado (aparentemente, no estaba involucrado en esa investigación de herramientas). Probablemente puse el C # y Oracle al revés en la pregunta principal.
Ed James
Debería considerar cambiar el nombre del título de su pregunta para que sea más descriptivo de los estándares de la base de datos.
maple_shaft
¿Cómo le quitaría tiempo a esto? Tendrás que hacerlo al menos dos veces para los 'casos externos'. Cree una herramienta y algunas clases reutilizables y nunca más se preocupe por eso.
Steven Evers

Respuestas:

27

Esta es una práctica bastante común, aunque no diría que la capacidad de soporte es el principal beneficio. El beneficio real de este enfoque es mantener un registro de auditoría. También es un lugar común tener una columna adicional que contiene el nombre de usuario del usuario que realizó la última actualización.

Si está tratando con algún tipo de información financiera o sensible, estoy seguro de que ha oído hablar de cosas como el cumplimiento de PCI y SOX . Tener una pista de auditoría integral es esencial para cumplir con esas especificaciones.

Descargo de responsabilidad: Sin embargo, hay formas mucho mejores de lograr un seguimiento de auditoría de base de datos> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails

MattDavey
fuente
Lo sentimos, olvidé mencionar que el cumplimiento de PCI (etc.) no es aplicable, ya hay un registro de auditoría de proceso en los registros (TODO se registra bastante a fondo).
Ed James
66
"(TODO se registra a fondo)" ¿eso incluye CreatedDate y LastUpdatedDate? Si es así, tal vez podría
dirigir a
2
Ese es un punto muy bueno, tal vez debería estar presionando para obtener un analizador de registros más eficiente que podamos usar para consultar fácilmente los datos archivados (obviamente, los datos son para fines de seguimiento de auditoría, por lo que no tenemos más de una semana o más de valor disponible para consulta, el resto se almacena).
Ed James
3
No creo que este enfoque produzca una pista de auditoría rica ... Ni siquiera lo llamaría una pista de auditoría .
Jordão
@ Jordão ¡Dije que era un enfoque común, no dije que fuera bueno! De ahí el descargo de responsabilidad :)
MattDavey
17

El argumento anterior no es válido, porque agregar algunos campos de marca de tiempo mantenidos en una base de datos a una serie de tablas no es un trabajo difícil. De hecho, este es el tipo de tarea para adormecer la mente que uno le daría a un joven o un interno, y podrían hacerlo fácilmente en un solo sprint de dos semanas con tiempo de sobra.

Puede o no ser necesario asignar estos campos en su ORM, simplemente porque no desea que los usuarios de la aplicación modifiquen estos campos y porque son útiles para el mantenimiento y la depuración y rara vez se usan en la lógica empresarial. Trabajé en tiendas que lo hicieron en ambos sentidos y, francamente, no tengo mucha opinión sobre esto de ninguna manera.

Los beneficios, incluso si se exageran, superan con creces los costos humanos en la implementación de dicha funcionalidad en el nivel de la base de datos, y ciertamente probablemente menos que el poder mental colectivo de los grandes mentes técnicas de los proyectos que secuestran la reunión y la libran en una épica pelea. Cuando calcules el impacto que tienen unas pocas reuniones de 1 hora en la vida útil de un proyecto, probablemente no te sorprenderá que sean caras. Imagine los salarios colectivos por hora y los beneficios de todas esas personas combinadas y eso debería darle una idea.

árbol de arce
fuente
8
Cree un script que agregará estas columnas a cada tabla si aún no existen junto con los desencadenantes.
JeffO
3
+1 Puede generar fácilmente los scripts en pocos días. Solo mucho trabajo si se hace manualmente.
Jon Raynor
8

... mientras más declaraciones definitivas haga un hombre, más probable es que esté definitivamente equivocado ... - Tyler Durden

esto se aplica a los "estándares" generales, mientras que en algunas mesas esto podría ser una gran victoria, en todas las mesas probablemente sería un ruido inútil y más código para mantener u olvidar mantener.

hay un equilibrio aquí, eso es lo que debe impulsar a los tomadores de decisiones.


fuente
8

Estoy totalmente de acuerdo. Casi todas las tablas de cada base de datos deben tener al menos 2 campos: la fecha de creación y la fecha de actualización . Hay muchas razones por las que debe poner una fecha de creación y una fecha de actualización. Por razones obvias que las personas anteriores declararon ... que es auditoría.

He estado diseñando sistemas y bases de datos durante 25 años y he trabajado para cientos de clientes. No hay un solo cliente que NO necesite esto.

Hay 2 formas básicas de hacer esto:

1 - La primera práctica es dejar que la base de datos haga el trabajo y ponerla directamente en el diseño de la tabla. Cuál es el mínimo, recomendaría.

2 - La otra práctica, que prefiero ... es usar una herramienta de replicación para manejar esto. Hay pocos gastos generales y ningún costo para los equipos DEV. Sin embargo, las herramientas son caras. Una ventaja adicional es que el proceso de eliminación puede auditarse mucho más fácilmente con este tipo de herramienta. Sin una herramienta de replicación, necesitaría crear una tabla de auditoría y disparadores para las eliminaciones, en mi opinión, no es una buena práctica.

Otro beneficio de tener estos campos es el almacén de datos y ODS que SIEMPRE está construido para cualquier sistema OLTP. No puede extraer efectivamente datos incrementales sin él. De lo contrario, corre el riesgo de tener que volver a cargar toda la base de datos todos los días.

Hay una enorme cantidad de otras razones comerciales para poner estas 2 fechas, que no profundizaré aquí. Haga su tarea y estoy seguro de que 3-6-12-48 meses más adelante estará muy contento de poner en estos 2 campos simples.

He implementado y generalmente recomiendo ambas soluciones siempre que sea posible.

Andrew Venuto
fuente
5

Tenemos la fecha creada y creada por columnas en nuestra base de datos y nos han ayudado enormemente a rastrear problemas de datos. Si necesitamos revertir, nos ayuda a encontrar los registros correctos en las tablas de auditoría completas (porque sabemos dónde buscar en una tabla muy grande). Debería agregar un creado por y modificado por columnas también. Realmente ayuda saber quién puso los datos, especialmente si no tiene una auditoría completa.

No se me ocurre ninguna aplicación Enterprise que no necesite auditoría de una forma u otra. Aparentemente, su jefe cree que solo necesita una auditoría relativamente leve. Personalmente, estoy a favor de una auditoría completa en cada base de datos que contiene datos de los que depende su empresa (es mucho más fácil revertir esos 2000 registros incorrectos de las tablas de auditoría que restaurar las copias de seguridad) y lo requeriría si hubiera alguna información financiera, ya que yo He visto este tipo de cosas ayudar a atrapar a las personas que cometen fraude. Todas las auditorías deben realizarse a nivel de base de datos.

¿Cómo pueden ayudar estos datos? Bueno, primero se reduce cuándo buscar para encontrar los datos antiguos (en una revisión) y puede ayudarlo a ver qué versión de su programa estaba activa en el momento en que se ingresaron los datos. Entonces, si sabe que solucionó ese problema en la versión 2.3 que entró en funcionamiento el 6 de julio de 2011 y luego encontró el mismo problema con un registro insertado el 7 de agosto, entonces tal vez su solución no fue buena. Si necesita volver a los datos antiguos, le dirá en qué versión de las copias de seguridad puede encontrar los datos antiguos si no tiene una auditoría completa.

Los desarrolladores rara vez parecen pensar que los datos deben mantenerse a lo largo del tiempo y que alguien necesita corregir los datos incorrectos. Tener cosas así puede ser muy valioso para aquellos de nosotros que tenemos que hacer tales cosas. Tu jefe tiene razón, aunque no creo que haya ido lo suficientemente lejos en la auditoría. Solo se necesita un problema realmente serio que sea fácil de solucionar para justificar el poco tiempo que llevará agregar estas columnas y disparadores.

HLGEM
fuente
Prefiero ver a las personas de manera efectiva en las Pruebas de unidad de sus soluciones que intentar verificarlas con verificaciones de DB, pero agradezco su punto. Sin embargo, no estoy seguro de que el punto de hacer que se aplicaría mesa todos en todas nuestras bases de datos, incluso las tablas de referencia, etc.
Ed James
Las pruebas unitarias son independientes de la auditoría. Menciono que podría detectar un error porque lo he visto suceder incluso cuando hubo pruebas unitarias porque hubo un caso límite no probado. También puede señalar que los datos se ingresaron antes de la corrección de errores y luego es posible que deba buscar otros datos que también deben corregirse. O simplemente sepa que fueron los datos ingresados ​​a través de una importación el 6 de junio de 2016 que lo ayudarán a ver si el problema fue algo que hizo su importación o algo incorrecto con los datos en el archivo de importación. Eso es mucho más fácil que mirar a través de un año de archivos de importación diarios.
HLGEM
4

La carga de trabajo es discutible porque esto puede ser programado y aplicado a cada base de datos que jamás creará. Agregue las columnas a todas las tablas junto con los desencadenantes. Solo tienes que recordar ejecutarlo con tu construcción.

En cuanto a lo que quiere el cliente, puede hacer que le paguen para integrarlos en su aplicación como mejor les parezca. A muchos les gusta ver información adicional en un registro, como quién lo creó / cambió por última vez y cuándo. No es necesario enviar un correo electrónico a todos para averiguarlo o ser mentido. No desea tener que consultar un registro cada vez que alguien mira un registro.

Ponerlo en la base de datos y tenerlo allí por si acaso no es tan difícil y puede permitirle cobrar por funciones adicionales que utilizan los campos o simplemente para darle algunos comentarios sobre la cantidad de clientes que usan el sistema.

JeffO
fuente
Los clientes no han expresado ninguna opinión sobre el tema (por lo que yo sé), y probablemente no tengan idea acerca de nuestro nuevo impulso a los estándares, por lo que espero que no estén interesados ​​en pagar ninguna integración;) Sin embargo, Lo de "puede permitirle cobrar" es un argumento razonablemente bueno, si depende un poco del "poder" para mi enfoque habitual de desarrollo.
Ed James
1

Esto sería bastante trivial de implementar (tal vez de 1 a 3 días en total), por lo que, en mi opinión, es cuánto valor va a agregar a su aplicación a lo largo de su vida útil.

Primero, se necesitaría una instrucción alter table para agregar las columnas, la tabla alter sería la misma (excepto el nombre de la tabla), por lo que podría escribir un script para codificar y generar la instrucción alter SQL para todas las tablas que se necesita. . Debe permitir que los NULL tengan en cuenta los datos existentes y verificar la existencia de las columnas para que se pueda volver a ejecutar.

En segundo lugar, para las columnas, el uso de valores predeterminados, como GetUTCDate () (SQL Server, Oracle puede ser diferente) resuelve cualquier adición de codificación en la inserción, por lo que la base del código no tiene que cambiar para ninguna de las instrucciones de inserción ya que los valores predeterminados serán usado.

Las actualizaciones de datos (cambio a la última modificación) podrían resolverse con un activador de actualización. Nuevamente, este desencadenante sería casi el mismo en todas las tablas, por lo que este código desencadenante (SQL) podría generarse también para cualquier tabla existente.

Podría haber una gran cantidad de código de script sql (dependiendo de cuántas tablas), pero es un patrón que es repetible, por lo que podría generarlo mediante código mirando un esquema de base de datos existente.

Jon Raynor
fuente
Me preocuparía que con un enfoque de banda grande como ese tuviera problemas de mantenimiento a largo plazo con nuevas tablas, o que (aún peor) tuviera que hacer un sproc que escaneara cada tabla en busca de ciertas columnas con nombre y luego generara el script DDL para agregarlos si faltan, ¡lo que suena como una pesadilla de mantenimiento!
Ed James el
Si este es un estándar, es de esperar que el desarrollador que hace las nuevas tablas siga el estándar. De lo contrario, sí, pesadilla. El enfoque consiste en poner al día el esquema existente, después de que la responsabilidad recae en el desarrollador de seguir el estándar.
Jon Raynor
Creo que la palabra clave en ese comentario es "con suerte", ¡no estoy seguro de confiar en algo que tenga que suceder por voluntad propia de cada nuevo desarrollador!
Ed James
2
@Ed - De acuerdo, no hay confianza, ¡para eso están las revisiones de código! :)
Jon Raynor