2012-05-31 20 views
6

Vogliamo utilizzare cassandra per memorizzare dati complessi
ma non riusciamo a capire come organizzare gli indici.Cassandra utilizzando indici compositi e secondario insieme

Il nostro tavolo (famiglia colonna) si presenta così:

Users = 
    { 
    RandomId int, 
    Firstname varchar, 
    Lastname varchar, 
    Age int, 
    Country int, 
    ChildCount int 
    } 

Abbiamo query con campi obbligatori (nome, cognome, età) e le opzioni di ricerca extra (Paese, ChildCount).
Come dovremmo organizzare l'indice per rendere questo tipo di query più veloce?

Prima ho pensato, sarebbe stato naturale fare l'indice composito su (Nome, Cognome, Età) e aggiungere l'indice secondario separato sui campi rimanenti (Paese e ChildCount).
Ma non posso inserire righe nella tabella dopo aver creato gli indici secondari e non posso interrogare la tabella.

Utilizzando

  • cassandra 1.1.0
  • cqlsh con l'opzione --cql3.

Qualsiasi altro suggerimento per risolvere il nostro problema (domande complesse con opzioni obbligatorie e aggiuntive) è il benvenuto.

risposta

2

Questa è la mia idea. Potresti semplicemente creare una famiglia di colonne con RandomId come chiave di riga e tutti i campi rimanenti semplicemente come colonne (ad esempio nome di colonna 'firstname', valore di colonna 'jonh'). Dopo questo devi creare un indice secondario per ognuna di queste colonne. La cardinalità dei tuoi valori sembra essere bassa, quindi dovrebbe essere leggermente efficiente.

il codice CQL dovrebbe essere qualcosa di simile:

create column family users with comparator=UTF8Type and column_metadata=[{column_name: firstname, validation_class: UTF8Type,index_type: KEYS}, 
{column_name: lastname, validation_class: UTF8Type, index_type: KEYS}, 
{column_name: contry, validation_class: IntegerType, index_type: KEYS}, 
{column_name: age, validation_class: IntegerType, index_type: KEYS]}, 
{column_name: ChildCount, validation_class: IntegerType, index_type: KEYS]]; 

un buon riferimento per potrebbe essere http://www.datastax.com/docs/0.7/data_model/secondary_indexes

fatemi sapere se mi sbaglio;

1

Per le query che richiedono un numero elevato di partizioni, gli indici non sono molto efficienti.

Penso che sia meglio pensare alle tabelle in base alle query che si desidera creare: si desidera una tabella per le query in base al nome utente e sembra il posto giusto in cui archiviare tutte le informazioni relative all'utente. D'altra parte vuoi essere in grado di cercare in base al paese, ho pensato, per fornire un elenco di utenti: per questo non hai davvero bisogno di tutte le informazioni, forse solo il nome e il cognome, o solo l'email, ecc. Un altro tavolo potrebbe farlo allora.

Ciò comporta una duplicazione dei dati, ma che si adatta meglio alle idee di modellazione dei dati di Cassandra.

Questo darebbe:

CREATE TABLE users(
    id UUID, 
    lastname TEXT, 
    firstname TEXT, 
    age INT, 
    country TEXT, 
    childcount INT, 
    PRIMARY KEY(UUID) 
); 

CREATE TABLE users_by_country(
    country TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((country), firstname, lastname) 
); 

CREATE TABLE users_by_age(
    age INT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((age), firstname, lastname) 
); 
Problemi correlati