2012-05-31 7 views
6

Queremos usar cassandra para almacenar datos complejos
pero no podemos encontrar la manera de organizar los índices.Cassandra usando índices compuestos y secundarios juntos

Nuestra mesa (familia de columnas) se ve así:

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

Tenemos consultas con los campos obligatorios (nombre, apellido, edad) y las opciones de búsqueda adicional (país, ChildCount).
¿Cómo debemos organizar el índice para que este tipo de consultas sea más rápido?

Primero pensé que sería natural hacer un índice compuesto en (Nombre, Apellido, Edad) y agregar un índice secundario separado en los campos restantes (País y Conteo de niños).
Pero no puedo insertar filas en la tabla después de crear índices secundarios y no puedo consultar la tabla.

Usando

  • Cassandra 1.1.0
  • cqlsh con la opción --cql3.

Cualquier otra sugerencia para resolver nuestro problema (consultas complejas con opciones obligatorias y adicionales) son bienvenidas.

Respuesta

2

Esta es mi idea. Simplemente puede crear una familia de columnas con su RandomId como la clave de fila y todos los campos restantes simplemente como columnas (por ejemplo, nombre de columna 'firstname', valor de columna 'jonh'). Después de esto, debe crear un índice secundario para cada una de estas columnas. La cardinalidad de tus valores parece ser baja, por lo que debería ser ligeramente eficiente.

el código CQL debe ser algo como:

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]]; 

Una buena referencia para los que podría ser http://www.datastax.com/docs/0.7/data_model/secondary_indexes

Avísame si estoy equivocado;

1

Para consultas que implican una gran cantidad de índices de particiones no son muy eficientes.

Creo que es mejor pensar las tablas en función de las consultas que desea realizar: quiere una tabla para consultas basadas en el nombre de usuario y que parece el lugar correcto para almacenar toda la información relacionada con el usuario. Por otro lado, desea poder buscar según el país, supuse, para proporcionar una lista de usuarios: para eso no necesita realmente toda la información, tal vez solo el nombre y apellido, o solo el correo electrónico, etc. Otra mesa podría hacerlo entonces.

Esto implica cierta duplicación de datos pero que se ajusta mejor a las ideas de modelado de datos de Cassandra.

Esto daría:

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) 
); 
Cuestiones relacionadas