Je suis à la recherche d'un processus approprié permettant de conserver les révisions, ou instantanés, des lignes (et de leurs relations) dans une base de données.
Prenons l'exemple d'une plateforme de commerce électronique.
- Un client crée une commande. La commande est associée à une adresse de facturation et à une adresse de livraison.
- Le client en question modifie alors l'adresse dans son carnet d'adresses dans son profil.
- L'adresse ne doit pas changer pour la commande initiale.
J'ai examiné quelques concepts, l'un étant les tables dupliquées, un autre étant les bases de données temporelles, et un autre étant la conservation d'un identifiant de révision et d'un drapeau actif.
Bien que je comprenne que personne ne puisse vraiment me dire quelle est la solution la meilleure/la plus adaptée à mon application, car c'est une question ouverte aux opinions, etc. J'ai lu beaucoup de questions sur l'OS, et quelques articles sur les différentes implémentations, mais aucun ne compare vraiment chaque idée ou n'indique où elles seraient le mieux adaptées. J'ai décrit ci-dessous ma compréhension de chacun des concepts.
Tables en double
Stockez les informations dans des rangées correspondant aux données avec lesquelles elles doivent être instantanées. Par exemple, conservez une adresse dans les colonnes de la table des commandes d'une boutique en ligne.
Avantages
- Les données sont segmentées en tables clairement pertinentes, sans besoin de jointures, etc.
- Il n'est pas nécessaire de ne sélectionner que les lignes actives comme l'exigent les concepts ci-dessous.
- En supposant que les lignes soient horodatées, la plupart des avantages de la base de données temporelle sont conservés.
Inconvénients
- Duplication
- de schéma (particulièrement problématique lorsque plusieurs tables constituent une révision)
- de modèles lors de l'utilisation d'un ORM.
- de données si un instantané de données n'a pas changé et qu'il est réutilisé. Par exemple, si 10 commandes sont passées, l'adresse est stockée 11 fois (commandes+actuel).
- Code supplémentaire nécessaire pour gérer les insertions dans les tables concernées.
Bases de données temporelles / Indicateur de ligne active ou actuelle
Lignes de la base de données qui sont "sensibles au temps", c'est-à-dire que leur contexte est le temps entre deux dates. Les données peuvent être jointes lorsque leur contexte temporel se situe entre celui de la table temporelle.
Avantages
- Pas de duplication des schémas ou des modèles. Les modifications sont effectuées à un seul endroit.
- Le modèle ORM peut gérer la création d'une nouvelle ligne, le marquage comme actif, etc. de manière transparente.
- Pas de réplication des lignes où aucune modification n'a été apportée. Par exemple, 10 commandes pour une adresse n'enregistrent l'adresse qu'une seule fois.
Inconvénients
- Les requêtes deviennent plus complexes car les clauses jointes/où nécessitent la sélection de la ligne "active".
- Les tableaux s'encombrent de données historiques qui ne sont pas sélectionnées/appelées régulièrement.
Stocker juste la colonne modifiée, temporelle.
Disposez d'un tableau qui garde la trace des modifications apportées à tous les tableaux et notez la ligne à laquelle elles se rapportent et le moment où elles sont valables en termes de temps.
Avantages
- Stockage optimisé en termes de révisions car les données inchangées ne sont pas répliquées.
Inconvénients
- Les requêtes sont beaucoup plus complexes pour combiner la version de la colonne avec ses autres données.
J'ai déjà examiné les questions suivantes ici sur SO, et ces autres ressources
Edit : La raison pour laquelle je n'ai pas étiqueté cet article avec un SGBD particulier est que j'aimerais que le concept fonctionne avec le plus grand nombre possible de SGBD, car la plateforme est actuellement indépendante des SGBD et la couche d'abstraction lui permet de fonctionner avec MySQL et MSSQL, mais nous espérons qu'elle en supportera d'autres à l'avenir.
- Conception de la base de données pour les révisions ?
- Schéma relationnel pour les expressions temporelles de Fowler
- Conception de bases de données pour les révisions de textes
- Stocker les révisions des objets relationnels de manière efficace
- Garder l'historique des modifications de la page. Un peu comme le fait SO pour les révisions
- conserver l'historique dans une base de données
- http://en.wikipedia.org/wiki/Temporal_database
- http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/