Tradurre una dati MySQL / query impostato nella rappresentazione equivalente Cassandra
Domanda
Si consideri una tabella di MySQL 500 milioni di fila con la seguente struttura della tabella ...
CREATE TABLE foo_objects (
id int NOT NULL AUTO_INCREMENT,
foo_string varchar(32),
metadata_string varchar(128),
lookup_id int,
PRIMARY KEY (id),
UNIQUE KEY (foo_string),
KEY (lookup_id),
);
... che viene interrogato utilizzando solo i seguenti due query ...
# lookup by unique string key, maximum of one row returned
SELECT * FROM foo_objects WHERE foo_string = ?;
# lookup by numeric lookup key, may return multiple rows
SELECT * FROM foo_objects WHERE lookup_id = ?;
A fronte di tali richieste, come è possibile rappresentare la data set di dati utilizzando Cassandra?
Soluzione
ci sono due opzioni:
(1) è una specie di tradizione: avere uno CF (columnfamily) con gli oggetti foo, una riga per foo, una colonna per campo. quindi creare due CF indice, in cui la chiave riga in uno è i valori di stringa, e la chiave riga dell'altra è lookup_id. Colonne nelle righe dell'indice sono ids foo. Così si fa un GET sulla CF indice, poi un MULTIGET sugli ID restituito.
Si noti che se si può fare lo stesso ID come lookup_id allora avete un indice meno da mantenere.
clienti di alto livello come Lazyboy di Digg ( http://github.com/digg/lazyboy ) automatizzerà mantenendo CFS indice per voi. Cassandra in sé non lo fa automaticamente (ancora).
(2) è come (1), ma si duplicare interi oggetti foo in sottocolonne delle righe di indice (cioè, le colonne l'indice di alto livello sono supercolumns). Se non si è in realtà l'interrogazione da parte del foo id in sé, non è necessario memorizzarlo nella propria CF a tutti.