2011-12-15 1 views
7

Je souhaite 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 le contrôle de version pour les fichiers texte. Donc, j'imagine que cela fonctionne comme une rangée dans une table, qui a un contrôle de version. Par exemple, vous pouvez récupérer la dernière version de cette ligne ou une version précédente. Vous pourriez même ramifier de cette rangée.Quelles sont les méthodes standard/recommandées pour stocker les données de base de données contrôlées par version?

Est-ce que quelque chose comme ça existe?

Information potentiellement utile: J'utilise actuellement Python, Django & MySQL. J'expérimente avec MongoDB

Modifier pour plus de clarté/plus de contexte: Je cherche une solution plus adaptée au "contrôle de version" des lignes qu'aux bases de données; Je ne m'intéresse pas tellement à la création de bases de données entières. Par exemple, je serais en mesure d'interroger le contenu du blog au 01/01/2011 et au 01/01/2010 (sans basculer les bases de données).

+0

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

+0

@milan - depuis quand la base de données des versions git ** enregistre **? –

+0

La question ne dit pas * aucun * enregistrement de base de données, il dit que les articles de blog, qui sont principalement du texte, alors pourquoi pas? – milan

Répondre

2

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

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

J'ai une table master et revisions table. J'ai choisi ces 2 noms uniquement pour l'amour de l'exemple.

Qu'est-ce que maître fait est stocke les informations suivantes:

  • id (autoincrement)
  • version_id (int)

Qu'est-ce que revisions magasin est la suivante:

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

Ce que j'accompli cette façon est que j'avais obtenu une carte d'identité de, disons un billet de blog. Si quelqu'un modifie le message, je vais stocker cette information au tableau revisions. Via les déclencheurs, j'incrémente le version_id dans le tableau revisions. Après cela, je mettre à jour le tableau master avec le dernier numéro version_id. De cette façon, je ne dois pas effectuer MAX() lorsque 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. Il est facile de voir les changements, et il est également extrêmement rapide d'obtenir des données si vous abusez de certaines fonctionnalités sympas de MySQL (dans mes tables actuelles, j'utilise au maximum la clé primaire en cluster d'InnoDB). J'ai posté ici).

3

Le contrôle de version est un sujet compliqué; le faire correctement est vraiment difficile qui est essentiellement pourquoi même en utilisant par exemple. git peut être difficile. Je ne voudrais pas écrire un système de contrôle de version complet.

Pour des besoins plus simples, considérer cette structure, pseudo-MongoDB/JSON:

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..." 
} 

L'idée est ici de stocker séparément chaque version et un pointeur vers la version publique actuelle et la version actuelle pour les éditeurs Ma réponse est un peu centrée MongoDB (parce que j'ai construit un moteur de blog basé sur MongoDB pour un usage domestique), mais il devrait fonctionner de manière similaire pour tout système de stockage.

Avantages:

  • Pas besoin de faire MAX requêtes du numéro de version soit pour les messages publics ou privés
  • ne correspond pas last edited aux numéros de version, ce qui pourrait ne pas être souhaitable
  • Permet versioning même si une certaine version est déjà publiée
  • Peut aller chercher le teaser sans avoir à aller chercher l'article entier

Inconvénients:

  • Copie le texte en entier à chaque fois. Pas une réelle préoccupation pour les données textuelles je suppose (essayez de taper 1GB ...). Sera un problème pour les plus grands sites de blogs, cependant. Atténuation: Compresser le texte en utilisant deflate, delta-compression.
  • doit mettre à jour deux objets sur la mise à jour
2

OffScale DataGrove vous permet de version que vous ensemble DB.

Il suit toutes les modifications apportées à la base de données et vous pouvez marquer les versions et basculer entre elles. DataGrove est unique dans le fait qu'il met à jour l'ensemble du DB - schéma et données.

Dans votre exemple, ajoutez simplement la ligne/les données que vous voulez dans la base de données et étiquetez une version. Vous serez toujours capable de revenir à cette version et même de la ramifier.

+1

De votre description, DataGrove semble être plus orienté vers la dérivation pour des bases de données entières que pour des lignes individuelles. (Voir édition) – cammil

Questions connexes