Je parcourais ce post pour la versionnalisation au niveau des tables. J'ai remarqué que l'architecture traite de l'utilisation des tables d'histoire. Cependant, mon scénario ne nécessite pas d'annulation mais de récupération des enregistrements ponctuels dans le temps. C'est là que j'ai essayé avec un design sur l'utilisation d'une seule table pour le versioning. Notez qu'il s'agit de données de table sans os (pas de contraintes, d'index, etc.). J'ai l'intention d'indexer basé sur l'identification puisque ceci implique la clause de groupe par sur la colonne.Versionnement de base de données sans tables d'historique
Par exemple, j'ai obtenu un test de table où
idest l'identifiant,
modstamp est l'horodatage des données (jamais nulles)
En plus de la colonnes ci-dessus, la table contiendra des colonnes de comptabilité
local_modstamp est le t imestamp au cours de laquelle le dossier a été mis à jour
del_modstamp est l'horodatage auquel l'enregistrement a été supprimé
Pendant la sauvegarde, tous les enregistrements sont obtenus à partir de la source et inséré où les enregistrements auraient les valeurs local_modstamp = null et del_stamp = null.
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
Une fois que les dossiers sont obtenus, ceux-ci sont les scénarios de traitement des données (en supposant que le temps de référence [ref_time] est le moment où le processus est exécuté):
Insérer comme d'habitude.
Mise à jour: mise à jour de l'enregistrement le plus récent avec local_modstamp = ref_time. Puis insérez le nouvel enregistrement. La requête serait: mise à jour = Test set local_modstamp où id = et local_modstamp est non nul et del_modstamp est non nulle insert en valeurs de test (...)
Supprimer: Mettre à jour le disque le plus récent avec del_modstamp = ref_time. Test de mise à jour définie del_modstamp = où id = et local_modstamp est non nul et del_modstamp est non nul
L'objectif de conception à obtenir les derniers enregistrements où local_modstamp n'est pas nulle et del_modstamp est non nul. Cependant, je suis tombé sur un problème où je compte récupérer point dans le temps en utilisant la requête (plus interne requête):
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
Il semble que je l'ai fait une erreur (ai-je?) D'utiliser NULL un espace réservé pour identifier les derniers enregistrements de la table. Existe-t-il un moyen d'utiliser la conception existante pour obtenir les enregistrements ponctuels?
Sinon, je suppose que la solution probable est de définir le local_modstamp sur les derniers enregistrements. Cela nécessiterait de mettre à jour la logique en utilisant max (local_modstamp) en cas de mises à jour. Est-ce que je peux persister sur mon architecture existante pour obtenir la récupération des données ponctuelles?
J'utilise SQL-Server maintenant, mais cette conception peut également être étendue à d'autres produits de base de données. J'ai l'intention d'utiliser une approche plus générale pour récupérer les données au lieu d'utiliser le fournisseur spécifique hacks.
Si j'effectue une suppression, la dernière version sera-t-elle marquée avec 1 ou est-elle insérée, puis marquez la suppression avec 1? Cela affectera la requête 'and v.IsDeleted = 0;' dans la requête. Par exemple, Sally quitte l'entreprise le 2016-10-01 mais je dois demander quel est l'état le 2016-06-01, ignorera isDeleted dans la clause atteindre le but? Je suis dans une énigme quant à la normalisation des tables. Je fais un backing autour de quelques milliers dans un schéma et si la normalisation en deux ne va pas gonfler la table. Cela peut-il être porté sur la même table? – dmachop
S'il n'y a pas de données statiques et que chaque colonne est versionnée dans la table des versions, la solution ci-dessus peut être effectuée avec une seule table. Chaque fois que vous sélectionnez un point dans le temps ou les dernières données, il faudrait créer une table temporaire (sélectionnez distinct (id) à partir de la version), puis effectuez une jointure si nécessaire. – dmachop
Le PK est statique et l'expérience montre qu'il n'y a rarement d'autres attributs statiques. Cependant, vous avez toujours besoin de deux tables même si la table principale contient uniquement le PK. Vous avez besoin d'une table maître non versionnée pour être la cible des FK provenant d'autres tables. Si vous lisez les différents schémas de gestion des versions, le grand problème insurmontable a toujours été le manque d'intégrité référentielle. Ceci (vnf) résout ce problème. – TommCatt