Esto no es fácil.
Básicamente está solicitando una Base de Datos Temporal (Lo que Christopher Date llama Sexta Forma Normal, o 6NF).
Para ser 6NF, un esquema también debe ser 5NF, y, básicamente, para cada dato, debe adjuntar un rango de tiempo para el cual el dato en ese valor es aplicable. Luego, en uniones, la unión debe incluir solo las filas que están dentro del rango de tiempo considerado.
El modelado temporal es difícil, es lo que hace la sexta forma normal de direcciones, y no es bien soportado en los RDBMS actuales.
El problema es la granularidad. La 6ª Forma Normal (según la entiendo) admite el modelado temporal haciendo que cada no clave (no clave :, es decir, cualquier cosa "activada" en la entidad que puede cambiar sin que la entidad pierda su identidad) sea una relación separada. A esto, agrega una marca de tiempo o intervalo de tiempo o número de versión. Hacer que todo sea una unión resuelve el problema de granularidad, pero también significa que sus consultas serán más complicadas y lentas. También requiere descubrir todas las claves y atributos no clave; esto tiende a ser un gran esfuerzo.
Básicamente, todo el mundo que tienen una relación ("Ted posee el certificado de acciones de GM con id 789") se agrega una vez: "Ted posee el certificado de acciones de GM con id 789 ahora" de manera que se puede decir al mismo tiempo, "Fred posee el certificado de acciones de GM con ID 789 desde el 3 de febrero de 2000 hasta ayer". Obviamente, estas relaciones son de muchos a muchos, (ted puede poseer más de un certificado ahora, y más de uno a lo largo de su vida, también, y fred puede haber sido el propietario del certificado ahora).
Así que tenemos una tabla de propietarios, una tabla de certificados de acciones y una tabla de muchos a muchos que relaciona a los propietarios y certificados por identificación. En la tabla de muchos a muchos, agregamos un start_date y un end_date.
Ahora imagine que cada estado/provincia/tierra grava los dividendos de los certificados de acciones, por lo que a efectos fiscales registrar el estado de residencia del propietario del certificado de acciones.
Donde el propietario reside, obviamente, puede cambiar de forma independiente con la posesión de acciones; Ted puede vivir en Nebraska, comprar 10 acciones, obtener un dividendo que Nebraska grava, mudarse a Nevada, vender 5 acciones a Fred, comprar 10 acciones más.
Pero para nosotros, es ted puede mover a Nebraska en algún momento, comprar 10 acciones en algún momento, obtener un dividendo en algún momento, que grava Nebraska, mover a Neveda en algún momento , vende 5 acciones a fred en algún momento, compra 10 acciones más en algún momento.
Necesitamos todo eso si queremos calcular qué impuestos debe pagar en Nebraska y en Nevada, uniéndonos a los rangos de fechas coincidentes/superpuestos en person_stockcertificate y person_address. La dirección de una persona ya no es uno a uno, es de uno a muchos porque es la dirección durante el intervalo de tiempo.
Si ted compra diez acciones, ¿modelamos un evento de compra con una sola fecha de compra, o agregamos una fecha_comprimida a cada acción? Depende de la pregunta que necesitamos que responda el modelo.
SQL Server 2005 o 2008. Sin embargo, si hay otro RDBMS que tiene una solución integrada para este tipo de problema, me gustaría saberlo. Thx – saille