Cassandra - Agrupación por ID y pedido por fecha
Una parte de mi aplicación consiste en un foro de discusión: hay hilos, publicaciones y categorías. Los hilos se agrupan por categoría y las publicaciones se agrupan por hilos. Tengo un problema con un modelo/consulta que permitirá la selección de hilos por categoría con un orden descendente de su última publicación.
Categoría
CREATE TABLE keyspace.categories (
id ascii PRIMARY KEY,
description text,
name text,
...
);
Hilo
CREATE TABLE keyspace.threads (
id ascii PRIMARY KEY,
category_id ascii,
content text,
...
);
Publicar
CREATE TABLE keyspace.posts (
thread_id ascii,
created_at timestamp,
id ascii,
content text,
...
PRIMARY KEY (thread_id, created_at, id)
);
Inicialmente pensé en poner el tiempo "creado en" de la última publicación como una clave de agrupación en la tabla de hilos, pero eso es imposible ya que cambia con cada publicación.
Entonces pensé en crear una tabla intermedia en la que se escriba cada vez que se crea una publicación. Esto resuelve el problema de inmutabilidad con el primer enfoque, pero el problema es que contendrá múltiples valores por subproceso y no he podido descifrar un orden de partición/agrupación que permita agrupar por subproceso y ordenar por fecha.
Por ejemplo, lo siguiente me permitiría agrupar por tema, pero no ordenar por fecha:
CREATE TABLE last_post_for_category (
category_id ascii,
thread_id ascii,
created_at timestamp,
PRIMARY KEY ((category_id), thread_id, created_at)
) WITH CLUSTERING ORDER BY (thread_id DESC, created_at DESC);
SELECT thread_id FROM last_post_for_category WHERE category_id = 'category' GROUP BY thread_id, created_at;
Y lo siguiente me permitiría ordenar por fecha, pero no agrupar por hilo:
CREATE TABLE keyspace.last_post_for_category (
category_id ascii,
thread_id ascii,
created_at timestamp,
PRIMARY KEY ((category_id), created_at, thread_id)
) WITH CLUSTERING ORDER BY (created_at DESC, thread_id DESC);
SELECT thread_id FROM last_post_for_category WHERE category_id = 'category' GROUP BY created_at, thread_id;
Tampoco puedo hacer un distinct
en (category_id, thread_id)
porque no sé nada sobre los ID de subprocesos en el punto en el que se ejecuta esta consulta.
¿Alguien tiene alguna idea de cómo puedo representar mejor este pedido?
Mostrar la mejor respuesta