versiones que commands cassandra cql

que - install cassandra



Resultados de consulta no ordenados a pesar de CON CLUSTERING ORDER BY (2)

Estoy almacenando publicaciones de todos los usuarios en la tabla. Quiero recuperar publicaciones de todos los usuarios que el usuario está siguiendo.

CREATE TABLE posts ( userid int, time timestamp, id uuid, content text, PRIMARY KEY (userid, time) )WITH CLUSTERING ORDER BY (time DESC)

Tengo los datos sobre quién sigue a todos los usuarios en otra tabla

CREATE TABLE follow ( userid int, who_follow_me set<int>, who_i_follow set<int>, PRIMARY KEY ((userid)) )

Estoy haciendo una consulta como

select * from posts where userid in(1,2,3,4....n);

2 preguntas:

  1. por qué todavía obtengo datos en orden aleatorio, aunque CLUSTERING ORDER BY se especifica en las publicaciones. ?
  2. ¿Es correcto el modelo para satisfacer la consulta de manera óptima (el usuario puede tener n cantidad de seguidores)?

Estoy usando Cassandra 2.0.10.


Este es mi nuevo esquema,

CREATE TABLE posts(id uuid, userid int, follows int, created timestamp, PRIMARY KEY (userid, follows)) WITH CLUSTERING ORDER BY (created DESC);

Aquí ID de usuario representa quién lo publicó y sigue representa ID de usuario para su uno de los seguidores. Say user x sigue a otras 10 personas, estoy haciendo 10 + 1 inserts. Definitivamente hay demasiada duplicación de datos. Sin embargo, ahora es más fácil obtener la línea de tiempo para uno de los usuarios con la siguiente consulta

select * from posts where follows=?


"¿Por qué todavía obtengo datos en orden aleatorio, aunque CLUSTERING ORDER BY se especifica en las publicaciones?"

Esto se debe a que ORDER BY solo funciona para filas dentro de una clave de particionamiento particular. Entonces, en su caso, si desea ver todas las publicaciones para un usuario específico como este:

SELECT * FROM posts WHERE userid=1;

Eso devuelve los resultados ordenados por time , ya que todas las filas dentro de la clave de partición userid=1 se agruparán en clústeres.

"¿Es correcto el modelo para satisfacer la consulta de manera óptima (el usuario puede tener n cantidad de seguidores)?"

Funcionará, siempre y cuando no le importe obtener los resultados ordenados por fecha y hora. Para poder consultar publicaciones para todos los usuarios ordenados por tiempo, necesitaría encontrar una clave de partición diferente. Sin saber demasiado acerca de su aplicación, podría usar una columna como GROUP (por ejemplo) y particionar en eso.

Digamos que usted asigna de manera uniforme a todos sus usuarios a ocho grupos: A, B, C, D, E, F, G y H. Digamos que su diseño de mesa cambió así:

CREATE TABLE posts ( group text, userid int, time timestamp, id uuid, content text, PRIMARY KEY (group, time, userid) )WITH CLUSTERING ORDER BY (time DESC)

A continuación, puede consultar todas las publicaciones para todos los usuarios del grupo B, como esta:

SELECT * FROM posts WHERE group=''B'';

Eso le daría todas las publicaciones para todos los usuarios del grupo B, ordenados por tiempo. Así que, básicamente, para que su consulta ordene las publicaciones apropiadamente por tiempo, necesita dividir los datos de la publicación en algo que no sea ID de usuario.

EDITAR :

PRIMARY KEY (userid, follows)) WITH CLUSTERING ORDER BY (created DESC);

Eso no va a funcionar. De hecho, eso debería producir el siguiente error:

código = 2200 [Consulta inválida] message = "Falta ORDEN DE CLÚSTERO para la columna siguiente"

E incluso si añadieras follows a tu cláusula CLUSTERING ORDER , CLUSTERING ORDER esto:

código = 2200 [consulta no válida] message = "Solo las columnas de clave de agrupamiento se pueden definir en la directiva CLUSTERING ORDER"

La cláusula CLUSTERING ORDER solo se puede usar en la (s) columna (s) de clúster, que en este caso, es solo la follows columna. Modifique la definición de PRIMARY KEY para clúster en los follows (ASC) y created (DESC). He probado esto e inserté algunos datos de muestra, y puedo ver que esta consulta funciona:

aploetz@cqlsh:> SELECT * FROM posts WHERE userid=2 AND follows=1; userid | follows | created | id --------+---------+--------------------------+-------------------------------------- 2 | 1 | 2015-01-25 13:27:00-0600 | 559cda12-8fe7-45d3-9a61-7ddd2119fcda 2 | 1 | 2015-01-25 13:26:00-0600 | 64b390ba-a323-4c71-baa8-e247a8bc9cdf 2 | 1 | 2015-01-25 13:24:00-0600 | 1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4 (3 rows)

Aunque, si desea consultar solo por userid , puede ver las publicaciones de todos sus seguidores. Pero en ese caso, las publicaciones solo se ordenarán dentro de cada followerid , así:

aploetz@cqlsh:> SELECT * FROM posts WHERE userid=2; userid | follows | created | id --------+---------+--------------------------+-------------------------------------- 2 | 0 | 2015-01-25 13:28:00-0600 | 94da27d0-e91f-4c1f-88f2-5a4bbc4a0096 2 | 0 | 2015-01-25 13:23:00-0600 | 798053d3-f1c4-4c1d-a79d-d0faff10a5fb 2 | 1 | 2015-01-25 13:27:00-0600 | 559cda12-8fe7-45d3-9a61-7ddd2119fcda 2 | 1 | 2015-01-25 13:26:00-0600 | 64b390ba-a323-4c71-baa8-e247a8bc9cdf 2 | 1 | 2015-01-25 13:24:00-0600 | 1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4 (5 rows)