Позвольте мне понять - если пара (userId, placeId)
должна быть уникальной (означает, что вам не нужно ставить две строки с этой парой данных), что такое timeVisit
, полезный для первичного ключа? Зачем вам выполнять запрос с использованием order by visitTime desc
, если у него будет только одна строка?
Если вам необходимо предотвратить дублирование, у вас есть 2 способа.
1 - Легкая сделка - это, используя IF NOT EXISTS
, сделает то, что вы хотите. Но, как я объяснил, here легкие транзакции действительно медленные из-за особой обработки cassandra
2 - USING TIMESTAMP
Writetime enforcing - (будьте осторожны!***) 'трюк', чтобы заставить убывающую TIMESTAMP
Позвольте мне привести пример:
INSERT INTO users (uid, placeid , visittime , otherstuffs) VALUES (1, 2, 1000, 'PLEASE DO NOT OVERWRITE ME') using TIMESTAMP 100;
Это производит этот выход
select * from users;
uid | placeid | otherstuffs | visittime
-----+---------+----------------------------+-----------
1 | 2 | PLEASE DO NOT OVERWRITE ME | 1000
Давайте теперь уменьшить timestamp
INSERT INTO users (uid, placeid , visittime , otherstuffs) VALUES (1, 2, 2000, 'I WANT OVERWRITE YOU') using TIMESTAMP 90;
Теперь в таблице данные не были обновлены, так как существует высокая операция TS (100) для пары (uid, placeid)
- на самом деле здесь выход не изменился
select * from users;
uid | placeid | otherstuffs | visittime
-----+---------+----------------------------+-----------
1 | 2 | PLEASE DO NOT OVERWRITE ME | 1000
Если производительность имеет значение, то использовать решение 2, если производительность не имеет значения, а затем использовать раствор 1. Для решения 2 можно вычислить убывающую метку времени для каждой записи с использованием фиксированного числа минус системное время Миллис
например:
Long decreasingTimestamp = 2_000_000_000_000L - System.currentTimeMillis();
*** это решение может привести к неожиданному поведению, если вы хотите удалить, а затем повторно вставить данные. Важно знать, что как только вы удалите данные, вы сможете их снова записать, только если операция записи будет иметь более высокую отметку времени удаления (если не указано, используется метка времени), то
HTH,
Carlo
Вы пытаетесь отслеживать самое последнее время посещения для отдельного пользователя и места? Или какая часть таблицы должна быть уникальной? Почему вы не хотите добавлять visitTime на свой ПК? –
Ваш вопрос непонятен - отредактируйте его, объясняя, что вам нужно и что вы пытаетесь сделать (кстати, ваш оператор неверен в C *) –
Порядок кластеризации применяется только к строкам с одним и тем же ключом раздела (который будет использоваться с идентификатором пользователя в твоем случае). Это не относится к строкам с разными идентификаторами пользователей. См. Больше информации здесь: http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_compound_keys_c.html – jny