Base De Datos – Control De Versiones De Datos

He leído un par de preguntas sobre LO (tales como este) en lo que respecta a control de versiones de sus datos dentro de una base de datos.

Me gustaron algunas de las sugerencias que se han mencionado. Tengo por el mayor tiempo que quería (necesarios) para la revisión de muchos de mis tablas, pero nunca llegó a hacerlo. Siendo un programador con sólo la simple base de datos de trabajo bajo mi cinturón, me preguntaba cómo una realidad podría ir sobre hacer esto.

No estoy pidiendo que la solución real en la sintaxis de SQL. Yo, finalmente, puede averiguarlo por mí mismo (o post ASÍ que cuando llegue el momento). Sólo estoy pidiendo a la gente a comentar cómo se podría ir sobre hacer esto y de los posibles problemas de rendimiento no puede ser si yo era la ‘revisión’ de cientos de millones de registros. O cualquier otra sugerencia, como siempre que se basa en el ejemplo de abajo.

Dado un ejemplo sencillo:

Person
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL

Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
TableName         VARCHAR(50) NOT NULL,        -- What
OldRecID          UINT NOT NULL,               -- Where
NewRecID          UINT NOT NULL,
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why

No estoy seguro de cómo sería de enlace de la tabla de Auditoría a cualquier otro tablas (como Persona) si el TableName es una cadena?

También, suponiendo que tengo tres interfaz gráfica de usuario para rellenar:

  1. Un registro completo para una persona específica id
  2. Una vista de tabla de la lista de todas las personas (por identificación)
  3. Una vista que muestra a cada persona con su revisión de la información debajo de cada entrada (# de revisiones por persona, las fechas de las revisiones, comentarios de la revisión, etc), ordenado por las revisiones más recientes.

Para lograr 1 y 2, sería mejor consultar a la Persona de la tabla o la tabla de Auditoría?

Para lograr la 3, lo que se llama una base de datos de expertos de simplemente obtener todos los registros y la transfiere al software para el procesamiento, o grupo por PersonID y Afectó a la fecha? Es esto por lo general a cargo de una consulta o muchos?

  • La auditoría comentario es poco probable que se usa mucho menos que se rellenarán automáticamente con él.
InformationsquelleAutor Jeach | 2009-04-17

4 Kommentare

  1. 46

    He hecho varios tipos de esquemas de auditoría a través de los años y actualmente estoy va a implementar algo como esto:

    Person
    ------------------------------------------------
    ID                UINT NOT NULL,
    PersonID          UINT NOT NULL,
    Name              VARCHAR(200) NOT NULL,
    DOB               DATE NOT NULL,
    Email             VARCHAR(100) NOT NULL
    
    
    Person_History
    ------------------------------------------------
    ID                UINT NOT NULL,
    PersonID          UINT NOT NULL,
    Name              VARCHAR(200) NOT NULL,
    DOB               DATE NOT NULL,
    Email             VARCHAR(100) NOT NULL
    AuditID           UINT NOT NULL
    
    
    Audit
    ------------------------------------------------
    ID                UINT NOT NULL,
    UserID            UINT NOT NULL,               -- Who
    AffectedOn        DATE NOT NULL,               -- When
    Comment           VARCHAR(500) NOT NULL        -- Why
    

    Los registros actuales que están siempre en la Persona de la tabla. Si hay un cambio de una auditoría se crea el registro y el registro de edad se copian en el Person_History tabla (nota: el ID no cambia y puede haber varias versiones)

    El ID de Auditoría es en el *_History mesas, por lo que puede vincular varios registrar los cambios en un registro de auditoría si te gusta.

    EDICIÓN:

    Si usted no tiene una historia separada de la tabla para cada tabla de base y desea utilizar la misma tabla para mantener viejo y «borrado» de los registros, a continuación, usted tiene que marcar los registros con un indicador de estado. El problema con el que es un verdadero dolor al consultar los registros actuales – confía en mí, lo he hecho.

    • Gracias por la respuesta! Ese fue el camino que yo había imaginado en un primer momento, pero ya tengo más de 100 mesas de revisión, quería evitar, además, tener el 100 tablas de revisión y 100 de auditoría tablas. Esta es la razón por la que yo estaba tratando de compartir la tabla de auditoría a través de todos mis tablas, y también a evitar la duplicación de cada tabla. Tal vez mi objetivo es irracional, pero esta es la razón por la que estoy explorando e investigando sobre esto. De nuevo, gracias!
    • +1 para la historia de la tabla por tabla base. A menudo hay un deseo de tener una tabla de Auditoría. Esto puede conducir a serios problemas de rendimiento si el sistema está bastante ocupado. La tabla de auditoría se convierte en un cuello de botella para cada transacción. Simplemente si la transacción #2 está a la espera de trans #1 para completar su usuario experimentará una desaceleración
    • Sólo se necesita una tabla de Auditoría – pero usted todavía necesita una tabla de Historial de cada uno de sus cuadros principales
    • En mi caso la tabla de auditoría es sólo la fecha/hora y la información de usuario
    • Gran punto de Karl… ese es el tipo de información que estaba buscando. Yo estaba planeando sobre el uso de las transacciones más ampliamente lo que puede conducir a problemas de cuello de botella como usted ha dicho. Voy a tener que tomar eso en cuenta. Posiblemente incluso ejecutar los puntos de referencia para evaluar mi uso del mundo real. Estoy dispuesto a aceptar más el esquema de complejidad, pero no estoy dispuesto a sacrificar una vez onza de rendimiento. Gracias!
    • si la persona es eliminado. ¿el registro de borrados de la tabla persona y person_history mesa? lo que se debe utilizar como indicación en la tabla de auditoría para el registro eliminado?
    • Sí se elimina el registro de la persona a la tabla, sino que se trasladó a la historia de la tabla. Supongo que podría ser un indicador sobre la historia de la tabla para indicar que se trata de un registro eliminado.
    • Usted puede agregar una columna de estado y crear punto de vista que muestra sólo los registros actuales y siempre que lo desee puede consultar a la vista.
    • ¿Por qué no añadir los de Auditoría de las columnas de cada tabla?
    • Aunque esta pregunta y la respuesta se remontan a 2009, la salida temporal de las bases de datos y sus bitemporal tablas (SQL:2011 estándar).

  2. 6

    Acerca de cómo crear la tabla de la normal, tiene un ModifiedDate Colm en cada registro (y ModifiedBy si te gusta), y hacer todas tus datos de acceso a través de una vista materializada que agrupa los datos por Id y, a continuación, hace una ModifiedDate = MAX(ModifiedDate)?

    De esta manera, la adición de un nuevo registro con el mismo Id que otro le quite el viejo récord de la vista. Si quiere consultar el historial, no se vaya a través de la vista

    Siempre he encontrado el mantenimiento de tablas diferentes con el mismo Colm ser complejo y propenso a errores.

    • Experimenté con lo que se propone el uso de MySQL. Sé que es factible (en la teoría y parece bastante eficiente). El problema es que MySQL (he probado varias versiones) tiene fallos importantes con los puntos de vista (subquries, clase, orden, etc). Es un dolor en el @$$.
    • ¿Cuál es tu índice agrupado estrategia en la mesa?
    • No sé, este enfoque fue sólo un experimento de pensamiento!
  3. 2

    Siguientes DJ post en el uso de una historia de la tabla por tabla base y un comentario de Karl acerca de los posibles problemas de rendimiento, he hecho un poco de SQL investigación con el fin de averiguar la manera más rápida posible a la transferencia de un registro de una tabla a otra.

    Yo sólo quería documentar lo que he encontrado:

    Pensé que me tendría que hacer un SQL fetch para cargar el registro de la tabla base, seguido con un SQL empujar para poner el registro en la historia de la tabla, seguido por una actualización de la tabla de base para insertar los datos modificados. Total de 3 de las transacciones.

    Pero para mi sorpresa me di cuenta de que puede hacer las dos primeras transacciones utilizando una instrucción SQL SELECT INTO sintaxis. Estoy segura de que el rendimiento sería cien veces más rápido de hacer esto.

    A continuación, que nos iba a dejar simplemente ACTUALIZAR el registro con los nuevos datos dentro de la tabla base.

    Todavía no he encontrado una instrucción SQL para hacer todos los 3 de las transacciones a la vez (dudo que).

    • Usted no encontrará una sola instrucción para hacer todo a la vez. Usted puede simular los tres a la vez con una transacción o de un punto de retorno.
    • Un ejemplo de Sql sería muy apreciado
  4. 1

    Me gusta tu tabla de auditoría, es un buen comienzo. Tienes una cardinalidad problema con la tabla de auditoría, por lo que sería busto como dos tablas:

    Person
    ------------------------------------------------
    ID                UINT NOT NULL,
    PersonID          UINT NOT NULL,
    Name              VARCHAR(200) NOT NULL,
    DOB               DATE NOT NULL,
    Email             VARCHAR(100) NOT NULL,
    AuditID           UINT NOT NULL 
    
    Audit
    ------------------------------------------------
    ID                UINT NOT NULL,
    TableName         VARCHAR(50) NOT NULL,        -- What
    TableKey          UINT NOT NULL,
    CreateDate        DATETIME NOT NULL  DEFAULT(NOW),
    CreateUserID      UINT NOT NULL,
    ChangeDate        DATETIME NOT NULL  DEFAULT(NOW),
    ChangeUserID      UINT NOT NULL
    
    Audit_Item
    ------------------------------------------------
    ID                UINT NOT NULL,
    AuditID           UINT NOT NULL,               -- Which audit record
    UserID            UINT NOT NULL,               -- Who
    OldRecID          UINT NOT NULL,               -- Where
    NewRecID          UINT NOT NULL,
    AffectedOn        DATE NOT NULL,               -- When
    Comment           VARCHAR(500) NOT NULL        -- Why
    

    La disposición inicial propuesto tiene un único registro de Auditoría que señala (supongo) dos registros de personas. Los retos de este diseño son:

    • Que registros de la tabla persona
      son los actuales «real» de los registros?
    • ¿Cómo se puede representar la totalidad de la historia
      de cambios en el registro de Persona? Si
      se señala a dos registros en
      la Persona de la tabla, a continuación, ver punto #1:
      cuál es el registro actual?
    • El Crear*,* Cambio de los campos son enrollados
      a partir de una colección de Audit_Item
      registros. Están ahí sólo para
      la facilidad de acceso.
    • La AuditID clave en la Persona de la tabla le permite a punto de
      volver a la tabla de Auditoría y llegar a
      la historia de cada Persona
      sin necesidad de consulta de la Auditoría
      tabla con la cláusula WHERE
      TableName='Person'
    • He estado mirando tu «cardinalidad» tema por un tiempo y me parece que no puede entender su intención de beneficios? No UserID, CreateUserID y ChangeUserID duplicados de la misma información? No AffectedOn, CreateDate y ChangeDate también duplicados? Alos, no es esta la adición de otra transacción SQL cada vez que una persona se corrigen? Puedes editar tu post para explicar su proyecto de mejora… gracias!
    • Yo creo que has entendido mal el Aceptado la Respuesta del proceso. No sólo va a ser nunca una sola Persona que se registro en la tabla Persona. Habrá varios Person_History filas. Puntos de auditoría a varios Person_History, pero todos aquellos que apuntan a una sola Persona. Persona es ‘actual’, cada Person_History es una revisión anterior.

Kommentieren Sie den Artikel

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

Pruebas en línea