«Почему я все еще получаю данные в случайном порядке, хотя 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)
этот ответ определенно дал некоторые лучшее направление, но я хотел бы получить всю почту от всех пользователей, которых я ниже в порядке убывания времени. Я приведу свою новую схему ниже – turbo
@turbo edit made. – Aaron