2014-11-10 1 views
1

Я сохраняю сообщения от всех пользователей в таблице. Я хочу получить сообщение от всех пользователей, за которыми следует пользователь.Результаты запроса не заказаны, несмотря на СООТВЕТСТВИЕ С КЛАСТЕРНЫМ ЗАКАЗОМ

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

У меня есть данные о том, кто следует всем пользователем в другой таблице

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

Я делаю запрос как

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

2 вопроса:

  1. почему я до сих пор получать данные в случайном порядке, хотя CLUSTERING ORDER BY специфицирован в тюрьмах. ?
  2. Является ли модель правильной, чтобы удовлетворить запрос оптимально (пользователь может иметь n число последователей)?

Я использую Cassandra 2.0.10.

ответ

3

«Почему я все еще получаю данные в случайном порядке, хотя CLUSTERING ORDER BY указан в сообщениях?»

Это связано с тем, что ORDER BY работает только для строк в пределах определенного ключа секционирования. Так что в вашем случае, если вы хотите, чтобы увидеть все должности для конкретного пользователя, как это:

SELECT * FROM posts WHERE userid=1; 

Это вернуть ваши результаты отсортированы по time, так как все строки внутри ключа userid=1 перегородки будут сгруппированы по Это.

«Правильно ли модель удовлетворяет запросу оптимально (пользователь может иметь n число последователей)?»

Это будет работать, если вы не заботитесь о том, чтобы результаты были заказаны по метке времени. Чтобы иметь возможность запрашивать сообщения для всех пользователей, упорядоченных по времени, вам нужно будет создать другой ключ раздела. Не зная слишком много о вашем приложении, вы можете использовать столбец, например, GROUP (например) и раздел на нем.

Итак, давайте говорить, что вы равномерно распределить всех пользователей на восемь групп: A, B, C, D, E, F, G и H. Предположим, ваша конструкция стола изменилась так:

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

Вы могли бы запросить все сообщения для всех пользователей для группы B, как это:

SELECT * FROM posts WHERE group='B'; 

это даст вам все должности для всех пользователей в группе в, упорядоченный по времени. Поэтому в основном, чтобы ваш запрос упорядочил сообщения должным образом по времени, вам необходимо разбить данные своего сообщения на нечто иное, чем userid.

EDIT:

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

Это не будет работать.На самом деле, это должно произвести следующее сообщение об ошибке:

code=2200 [Invalid query] message="Missing CLUSTERING ORDER for column follows"

И даже если вы сделали добавить follows к вашей статье CLUSTERING ORDER, вы увидите следующее:

code=2200 [Invalid query] message="Only clustering key columns can be defined in CLUSTERING ORDER directive"

Предложение CLUSTERING ORDER может быть использован только на кластерная колонка (столбцы), которая в этом случае является только столбцом follows. Измените определение PRIMARY KEY в кластере на follows (ASC) и created (DESC). Я испытал это, и вставил некоторые образцы данных, и можно увидеть, что этот запрос работает:

[email protected]:stackoverflow> 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) 

Хотя, если вы хотите запросить лишь на userid вы можете увидеть сообщения от всех своих последователей. Но в этом случае сообщения будут упорядочены только внутри каждого followerid, как это:

[email protected]:stackoverflow> 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) 
+0

этот ответ определенно дал некоторые лучшее направление, но я хотел бы получить всю почту от всех пользователей, которых я ниже в порядке убывания времени. Я приведу свою новую схему ниже – turbo

+0

@turbo edit made. – Aaron

1

Это моя новая схема,

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

Здесь идентификатор представляет, кто разместил его и следует представляет идентификатор пользователя для его одного из последователей. Скажем, пользователь x следует 10 другим людям, я делаю 10 + 1 вставок. Определенно, слишком много дублирования данных. Однако теперь его легче получить график для одного пользователя с помощью следующего запроса

select * from posts where follows=? 
Смежные вопросы