2013-09-21 2 views
0

En supposant que tous les enregistrements de personnes sont identifiés par un UUID et que tous les groupes sont identifiés par un UUID. Quel modèle de données souhaitez-vous créer lorsque vous avez besoin d'interroger fréquemment la liste de toutes les personnes d'un groupe et la liste de tous les groupes auxquels appartient une personne. à savoirEnregistrement de l'appartenance à un groupe de personnes sous cassandra

create table membership (
    person_uuid uuid, 
    group_uuid uuid, 
    joined bigint, 
    primary key (person_uuid, group_uuid)); 

Ce qui précède optimiser pour l'interrogation par personne, et le serait au-dessous de l'optimisation pour l'interrogation par groupe.

create table membership (
    group_uuid uuid, 
    person_uuid uuid, 
    joined bigint, 
    primary key (group_uuid, person_uuid)); 

Y at-il une belle façon de gérer de sorte que vous pouvez parfaitement interroger par person_uuid et par group_uuid sans avoir à utiliser « permettre le filtrage », à savoir:

select group_uuid from membership where person_uuid=? 
select person_uuid from membership where group_uuid=? allow filtering 

-vous juste aller de l'avant et stocker deux des copies des données pour les requêtes dans les deux directions, cela a des problèmes d'atomicité si bien?

Répondre

0

@Jacob

Ce que vous pouvez faire est de créer l'index secondaire sur la deuxième composante de regroupement de clé primaire pour pouvoir interroger là-dessus.

create table membership (
    person_uuid uuid, 
    group_uuid uuid, 
    joined bigint, 
    primary key (person_uuid, group_uuid)); 

create index on membership(group_uuid); 

Bien sûr, vous aurez besoin d'ajouter permettent de filtrer à la requête, mais il sera beaucoup plus rapide que sans indice.

Si vous choisissez d'utiliser 2 tables de données d'index sans utiliser l'index secondaire, vous pouvez utiliser lot atomique lors de l'insertion des données pour garantir l'atomicité

Questions connexes