Question

Pouvez-vous partager vos pensées comment voulez-vous mettre en œuvre les données versioning dans Cassandra.

Supposons que je dois des documents de version dans un carnet d'adresses simple. (Dossiers de carnet d'adresses sont stockées sous forme de lignes dans un ColumnFamily). Je pense que l'histoire:

  • sera rarement utilisé
  • sera utilisé à la fois pour le présenter de façon « time machine »
  • il n'y aura pas plus de versions que quelques centaines à un seul enregistrement.
  • l'histoire n'expirera.

J'envisage l'approche suivante:

  • Convertir le carnet d'adresses Super Colonne famille et stocker plusieurs versions des dossiers de carnet d'adresses dans une rangée calée (par horodatage) comme super-colonnes.

  • Créer un nouveau Super Colonne famille pour stocker les anciens enregistrements ou des modifications aux dossiers. Cette structure ressemblerait comme suit:

    {  « Adresse clé de ligne de livre »: {     'STAMP1 temps': {             « Prénom »: « nom »,             « Modifié par »: « id utilisateur »,         },

    'time stamp2': {
            'first name': 'new name',
            'modified by': 'user id',
        },
    },
    

    « une autre adresse clé de ligne de livre »: {     « Horodatage »: {     ....

  • versions en magasin comme objet sérialisé (JSON) fixé dans la nouvelle ColumnFamilly. Représentant des ensembles de la version sous forme de lignes et versions sous forme de colonnes. (Sur le modèle simple document avec Versioning CouchDB)

Était-ce utile?

La solution

Si vous pouvez ajouter l'hypothèse que les carnets d'adresses ont généralement moins de 10.000 entrées en eux, puis en utilisant une ligne par adresse ligne de temps de livre dans une famille super colonne serait une approche correcte.

Une ligne ressemblerait à ceci:

{'address_book_18f3a8':
  {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}},
  {1290636018401680: {'entry1': 'entry1_stuff_v2', ...},
  ...
}

où la clé de ligne identifie le carnet d'adresse, chaque nom super colonne est un horodatage, et les sous-colonnes représentent le contenu du carnet d'adresses pour cette version.

Cela vous permettra de lire la dernière version d'un carnet d'adresses avec une seule requête et écrivez également une nouvelle version avec un seul insert.

La raison pour laquelle je suggère d'utiliser cette option si les carnets d'adresses sont à moins de 10 000 éléments est que super-colonnes doivent être complètement désérialisé lorsque vous lisez même un sous-colonne. Dans l'ensemble, pas si mal dans ce cas, mais il y a quelque chose à garder à l'esprit.

Une autre approche serait d'utiliser une seule ligne par version du carnet d'adresses, et d'utiliser un CF séparé avec une ligne de temps ligne par carnet d'adresses comme:

{'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}}

Ici, correspondent some_uuid1 et some_uuid2 à la clé de ligne pour les versions du carnet d'adresses. L'inconvénient de cette approche est qu'il nécessite deux requêtes chaque fois est lu le carnet d'adresses. La hausse est qu'il vous permet de lire efficacement que sélectionner des parties d'un carnet d'adresses.

Autres conseils

HBase ( http://hbase.apache.org/ ) a cette fonctionnalité intégrée. Lui donner un essai.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top