Traduzindo um dados MySQL / consulta de conjunto na representação equivalente Cassandra

StackOverflow https://stackoverflow.com/questions/2413466

  •  19-09-2019
  •  | 
  •  

Pergunta

Considere uma tabela MySQL 500 milhões de linhas com a seguinte estrutura mesa ...

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),
);

... que está sendo consultado usando apenas o seguinte duas consultas ...

# 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 = ?;

Dada essas consultas, como você representar o dado de dados em conjunto com Cassandra?

Foi útil?

Solução

Você tem duas opções:

(1) é uma espécie de tradicional: ter um CF (columnfamily) com seus objetos foo, uma linha por foo, uma coluna por campo. em seguida, criar dois CFs índice, onde a chave de linha em um é os valores de cadeia, ea chave linha no outro é lookup_id. Colunas nas linhas do índice são ids foo. Então você faz um GET na CF índice, em seguida, um Multiget sobre os ids retornado.

Note que, se você pode fazer id o mesmo que lookup_id então você tem um menor índice de manter.

clientes de alto nível como lazyboy do Digg ( http://github.com/digg/lazyboy ) irá automatizar a manutenção dos FCs índice para você. O próprio Cassandra não fazer isso automaticamente (ainda).

(2) é como (1), mas você duplicar todo os objetos foo em subcolunas das linhas do índice (ou seja, as colunas de nível superior de índice são supercolumns). Se você não está realmente a consulta pelo próprio id foo, você não precisa armazená-lo em seu próprio CF em tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top