9 votes

Instantanés/révisions des lignes de la base de données

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.

1voto

Ben Swinburne Points 6771

J'ai fini par utiliser une base de données temporelle, et l'implémentation de celle-ci a donné lieu à l'utilisation de l'option Modèle temporel en FuelPHP .

Je peux maintenant configurer mes modèles pour qu'ils traitent les lignes comme une entité sensible au temps. Les modifications entraînent la création d'une nouvelle ligne et la modification de l'heure de fin de la ligne d'origine en conséquence.

Cela me permet de récupérer une ligne à un moment donné dans le temps.

0voto

Robbie Dee Points 724

Il existe une autre option (sur Oracle au moins) qui vous permet de définir un point dans le temps et d'exécuter les requêtes que vous souhaitez.

Je crois que cela fonctionne en utilisant de grandes quantités d'espace de récupération flash, mais si vous n'êtes intéressé que par le suivi de quelques tables, cela pourrait être excessif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X