У меня есть следующая таблица, определенная в Cassandra 2.0.9:
CREATE TABLE history
(
histid uuid,
ddate text, -- Day Date, i.e. 2014-11-20
valtime timestamp, -- value time
val text, --value
PRIMARY KEY ((histid , ddate), valtime )
)
WITH CLUSTERING ORDER BY (valtime desc)
;
Скрипты ежедневно вставляют в эту таблицу несколько тысяч строк.
Мне нужно иметь возможность выбирать из этой таблицы, зная только гистид. Однако я разделил строки, используя (histid, ddate). Это означает, что у меня есть полный день значений истории для каждой строки.
Чтобы выбрать из этой таблицы определенный гистид, мне также нужно предоставить столбец ddate. Например:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
;
Чтобы получить самое последнее значение, я могу сделать следующее:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
LIMIT 1
;
Однако, если мне нужно самое последнее значение для любого данного histid, я не могу отправить запрос, не зная, что такое ddate, поскольку он является частью ключа раздела.
Итак... я спрашиваю, как лучше всего подойти к этому?
Это то, что я сделал, но я не знаю, разумно ли это:
Я создал дополнительную таблицу:
CREATE TABLE history_date
(
histid uuid,
maxdate timestamp, -- most recent date
PRIMARY KEY (histid)
);
Когда строка вставляется в таблицу истории, строка также вставляется в эту таблицу с помощью (histid, valtime).
Тогда наш программный код может:
1. query the history_date table for a particular id
2. take the "maxdate" column (truncate it to yyyy-mm-dd)
3. use the histid and truncated maxdate to query the history table to retrieve the most recent value.
Так что это работает. Но на самом деле это не похоже на хорошее решение.
Есть ли лучший способ сделать это, возможно, только с одной таблицей?
Спасибо за ваше время.