10
votes

Quelles sont les méthodes standard / recommandées de stocker des données de base de données contrôlées par la version?

Je veux stocker un article de blog dans une base de données. Je pensais que ce serait bien d'avoir différentes versions de ces données, un peu comme la vérification de la version pour les fichiers texte.

Alors, j'imagine que cela fonctionne comme une ligne dans une table, qui avait le contrôle de la version. Ainsi, par exemple, vous pouvez récupérer la dernière version de cette ligne ou une version précédente. Vous pouvez même brancher de cette rangée.

fait quelque chose comme ceci existe?

Peut-être des informations utiles: J'utilise actuellement Python, Django & MySQL. J'essaie d'expérimenter Mongodb

Modifier pour la clarté / plus de contexte: Je cherche une solution plus adaptée à la "version de contrôle" des lignes que des bases de données; Je ne suis pas tellement intéressé par la ramification des bases de données entières. Par exemple, je serais en mesure d'interroger le contenu de Blog Post au 1/1/2011 et au 1/1/2010 (sans commutation de bases de données).


4 commentaires

Avez-vous envisagé d'utiliser un système de contrôle de version comme Git? Serait intéressant de voir des avantages et des inconvénients d'une telle solution.


@milan - Depuis lors, lorsque la base de données de versions GIT enregistre ?


La question ne dit pas N'importe quel enregistrement de base de données , il indique des poteaux de blog, qui sont principalement du texte, alors pourquoi pas?


Est-ce que cela répond à votre question? Comment contrôler une version dans une base de données


3 Réponses :


5
votes

La version de la version est un sujet compliqué; Le fait droit est vraiment difficile, ce qui est essentiellement pourquoi même en utilisant em> par exemple. git peut être difficile. Je ne voudrais pas écrire un système de contrôle de version rempli de version complète.

Pour les exigences plus simples, considérez cette structure, dans Pseudo-MongoDB / JSON: P>

BlogPost {
    "_id": ObjectId("..."),
    "slug" : "how-to-version-my-posts",
    "author" : "cammil",
    "published" : date,
    "lastModified" : date,
    "publicVersion" : 32,
    "draftVersion" : 34,
    "teaserText" : "lorem ipsum dolor sit amet..."
}

BlogPostBody {
    "_id" : ObjectId("..."),
    "Version" : 32,
    "Text" : "lorem ipsum dolor sit amet..."
}
  • Pas besoin de faire max code> des requêtes du numéro de version pour les messages publics ou privés Li>
  • ne corrélait pas dernier édité code> aux numéros de version, qui pourrait ne pas être souhaitable li>
  • permet la version de la version même si une certaine version est déjà publiée li>
  • peut aller chercher le teaser sans avoir à chercher tout l'article li> ul>

    Inconvénients: P>

    • copie tout le texte à chaque fois. Pas une véritable préoccupation pour les données textuelles, je suppose (essayez de taper 1 Go ...). Sera un problème pour de grands sites de blogs, cependant. Atténuation: Compressez le texte en utilisant Deflate, Delta-Compression. Li>
    • doit mettre à jour deux objets sur la mise à jour li> ul> p>


0 commentaires

2
votes

Datagramrove offscale vous permet de la version de votre DB entière.

Il suit toutes les modifications qui arrivent à la base de données et vous pouvez étiqueter des versions et passer en arrière entre eux. Datagramrove est unique dans le fait qu'elle envoie la version complète de la DB - schéma et données.

Dans votre exemple - Ajoutez simplement la ligne / Données que vous souhaitez utiliser la version DB et étiqueter une version. Vous serez toujours capable de revenir à cette version et même de la succursale.


1 commentaires

De votre description, Datagramrove semble être plus orienté vers la ramification pour des bases de données entières que pour les lignes individuelles. (Voir Modifier)



5
votes

Tout d'abord, je dois dire que c'est une question intéressante.

Dans ma ligne de travail, je dois enregistrer des versions de divers entrées utilisateur. La façon dont je le fais et, par tous, je ne sais pas vraiment si c'est la bonne façon ou non, est la suivante:

J'ai un maître table et révisions table. J'ai choisi ces 2 noms pour l'exemple de l'exemple.

Quel maître stocke-t-il les informations suivantes:

  • ID (autocrampe)
  • Version_ID (int)

    Qu'est-ce que révisions est le suivant:

    • id
    • master_id
    • Version_ID
    • reste des données pertinentes sur l'entité entrée (dates, etc.)

      Qu'est-ce que j'ai réalisé de cette façon, c'est que j'avais obtenu un identifiant de, disons un poteau de blog. Si quelqu'un édite le poteau, je vais stocker cette information à révisions table. Via des déclencheurs, je incrémente le version_id dans révisions table. Après cela, je mettez à jour la table Master avec le dernier numéro version_id . De cette façon, je n'ai pas besoin d'exécuter max () quand je veux voir quelle est la dernière version.

      De cette façon, j'ai obtenu un système de version simple, mais puissant du contenu du site Web. Il est facile de voir des changements, et il est également extrêmement rapide d'obtenir des données si vous abusez des fonctionnalités de MySQL Cool (dans mes tables actuelles, j'abusente la clé primaire en clustere de InnoDB au maximum. La conception DB est donc légèrement diff. J'ai posté ici).


1 commentaires

Pouvez-vous fournir des informations sur la manière dont les maîtres et la révision sont liés?