SQL de la tabla del historial de diseño

Necesito el diseño de una tabla de historial de seguir la pista de varios valores que se han cambiado en un registro específico cuando se editó.

Ejemplo:

El usuario se presenta con una página para editar el registro.

Título: El Señor

Nombre: Joe

Tele: 555-1234

Fecha de NACIMIENTO: 1900-10-10

Si un usuario cambia cualquiera de estos valores que necesito para seguir la pista de los antiguos valores y de registro de los nuevos.

He pensado en usar una tabla como esta:

Historia
—————

id

modifiedUser

modifiedDate

tableName

recordId

oldValue

newValue

Un problema con este es que va a tener varias entradas para cada edición.
Yo estaba pensando en la otra tabla para el grupo de ellos, pero usted todavía tiene el mismo problema.

Yo también estaba pensando acerca de cómo mantener una copia de la fila en la tabla de historial, pero que no parece eficaz o.

Alguna idea?

Gracias!

  • Puedo decir que hemos implementado la mesa de la Historia en nuestro sistema y funciona muy bien. Sí, hay varias entradas por editar, pero si usted necesita para realizar un seguimiento de estos detalles para la auditoría razones por las que esta es la mejor manera de hacer esto.
  • Eso es casi de la misma manera en la que he aplicado a mis proyectos, a excepción de que me estoy perdiendo una columna columnName en su ejemplo. Estoy historizing sólo los valores que realmente ha cambiado (por lo que no todas las columnas de una fila) y estoy bien con esta solución.
InformationsquelleAutor hebime | 2012-12-04

3 Kommentare

  1. 13

    Debe definir qué tipo de eficiencia que usted está interesado en: usted puede tener la eficiencia de espacio de almacenamiento, la eficiencia de esfuerzo que se requiere para registrar la historia (costo de transacción), o la eficiencia de tiempo para la consulta para la historia de un registro en una manera específica.

    Veo que usted tiene un nombre de tabla en la propuesta de su mesa de historia, esto implica una intención de registrar el historial de más de una tabla, lo que descartaría la opción de guardar una copia exacta del registro en la historia de la tabla, a menos que todas las tablas que va a realizar el seguimiento siempre tienen la misma estructura.

    Si quieres columnas por separado, es decir, grabar sólo un valor de la columna para cada expediente de historia, tendrás que idear una polimórficos tipo de datos que es capaz de precisión que representan a cada valor de la columna te vas a encontrar.

    Si la eficiencia de espacio de almacenamiento es su principal preocupación, entonces me gustaría romper la historia en varias tablas. Esto significaría tener nuevo valor de la columna de la tabla vinculada tanto a una edición de la tabla de eventos y la definición de una columna de la tabla. La edición de la tabla de eventos se registro el usuario y el sello de tiempo, la definición de columna de la tabla de registro de la tabla, columna, y el tipo de datos. Como @njk lo contrario, usted no necesita el antiguo valor de la columna porque siempre se puede consultar la edición anterior para obtener el valor antiguo. La razón principal de este enfoque se espera para ahorrar espacio es la suposición de que, en general, los usuarios será la edición de un pequeño subconjunto de los campos disponibles.

    Si la eficiencia de la consulta es su principal preocupación, me gustaría establecer una tabla de historial para cada mesa va a realizar el seguimiento y agregar un usuario y la marca de tiempo de campo para cada tabla de historial. Esto también debe ser eficiente en términos de costos de transacción para una edición.

    • También me gustaría señalar que una tabla de auditoría para un montón de otras tablas se convertirá en un bloqueo de punto de dolor.
    • Puede convertirse en un punto de dolor si es que todo en una tabla. La forma en que se implementó la tabla de auditoría fue dividirlo por el esquema. Su base de datos utiliza esquemas para mantener tablas separadas y cada esquema tiene una tabla de auditoría.
    • Gracias por tu ayuda. Estaban en lo cierto al suponer que en varias tablas iban a tener registro en una tabla. Estoy considerando la posibilidad de usar una historia diferente de la tabla para cada uno de los otros tabla, ya que sólo será un pequeño subconjunto de los campos que se pueden editar. Esta parece ser la mejor opción.
    • excelente punto de re: polimórficos tipo de datos y trade-offs por el espacio vs costo de transacción vs el momento de la consulta
  2. 16

    Yo recomendaría que para cada tabla que se desea realizar un seguimiento de la historia, tiene una segunda tabla (es decir, tblCustomer y tblCustomer_History) con el mismo formato, además de una columna de fecha.

    Siempre una edición, insertar el viejo récord para la historia de la tabla junto con la fecha/hora. Esto es muy fácil de hacer y requiere un poco de cambios en el código (por lo general sólo un trigger)

    Esto tiene la ventaja de mantener su ‘real’ tablas tan pequeño como sea posible, pero le da un historial completo de todos los cambios que se realizan.

    En última instancia, sin embargo, va a venir a cómo desea uso este tipo de datos. Si es sólo para fines de auditoría, este método es sencillo y tiene poco baja, excepto el espacio extra en el disco y poco o ningún impacto en su sistema principal.

    • Gracias! Creo que me voy a ir a esta ruta. Parece ajustarse al modelo de mi sistema actual más.
  3. 3

    Usted no necesita registro antiguo y el nuevo valor en una tabla de historial. Acaba de grabar, el valor más reciente, el autor y la fecha. Usted puede, a continuación, sólo se captura el más reciente registro para algunos user_id basado en la fecha de registro. Esta puede no ser la mejor opción si usted tendrá que lidiar con un montón de datos.

    usuario (id, user_id, datetime, autor, …)

    Datos de la muestra

    id user_id datetime autor user_title user_name user_tele ... 
    1 1 2012-11-05 11:05 Bob 
    2 1 2012-11-07 14:54 Tim 
    3 1 2012-11-12 10:18 Bob

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea