2012-03-04 3 views
0

Supposons un modèle de données dans lequel un utilisateur a blog-posts. Chaque article a un titre unique et de nombreux attributs.Index secondaire dans Cassandra conduira à deux lectures de DB

J'ai une famille de colonne « postes » dans lequel chaque ligne est comme ceci:

posts = { 
    "yersterday" : { 
        date : 03-04-2012 
        userID : abfe222234 
        tags : "beatles,paul" 
        } 
     } 

Je veux indexer les messages de l'utilisateur, donc j'ai une autre famille chronique régulière:

user_posts = { 
     abfe222234 : { 
        yesterday : null 
        .... 
        } 
      } 

Ce modèle vient après beaucoup de recherches sur l'indexation secondaire dans Cassandra, dans lequel je suis venu à ces diapositives: http://www.slideshare.net/edanuff/indexing-in-cassandra et compris que la famille Super Column est de moins en moins utilisée.

Ma question:

Si vous voulez tous les détails sur les messages de l'utilisateur, cela signifie que je dois lire le DB deux fois: une fois pour obtenir tous les ID de messages, et une fois pour aller chercher tous ce poste détails pour ces ID.

Qu'est-ce qui me manque?

Merci, Issahar.

modifier:

L'autre option, est de faire « user_posts » être un Super CF, et le rendre contient toutes les données qui sont à l'intérieur « messages ». Les avantages: vous devrez aller chercher toutes les données une seule fois. Par contre: 1. Vous dupliquerez toutes vos données. 2. Vous ne pouvez pas rechercher une fois l'attribut d'un message.

Que dites-vous?

Répondre

1

Cela me semble assez simple - vous devez en effet effectuer deux lectures de base de données pour obtenir les données dans ce cas. Pour ce que cela vaut, la plupart des bases de données relationnelles doivent également effectuer deux lectures logiques, sauf si les données qui intéressent l'utilisateur sont entièrement contenues dans l'index. La seule différence est que dans une base de données relationnelle, il n'y a qu'un seul aller-retour réseau.

+0

Et s'il y a des centaines de messages? comment allez-vous le chercher? construire un CQL très très long avec "KEY in ('a', 'b', ...)"? ça ne semble pas juste! –

+0

Lentement, j'imagine. Sérieusement, l'utilisation d'un prédicat semble être l'approche logique. Voir http://prettyprint.me/2010/01/20/introduction-to-nosql-and-cassandra-part-2/ par exemple, en particulier "Lors de la lecture ou de l'écriture de données, il est possible de lire/écrire un ensemble de colonnes pour une clé spécifique (ligne) de manière atomique Cet ensemble de colonnes peut être spécifié par les noms de colonne de liste ou par un prédicat de tranche, en supposant que les colonnes sont triées d'une certaine façon (c'est un paramètre de configuration) " –

+0

trié du tout. Vous avez des messages de l'utilisateur A, puis les messages de l'utilisateur B, puis les messages de l'utilisateur A. BTW, je parle hébreu, donc merci pour le pointeur ... :) –

Questions connexes