【发布时间】:2015-01-27 15:45:35
【问题描述】:
我在 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。 但是,我使用 (histid, ddate) 对行进行了分区。 意思是,我每行有一整天的历史值。
为了从该表中选择特定的 histid,我还需要提供 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.
所以这行得通。但是,这并不是一个好的解决方案。
有没有更好的方法来做到这一点,也许只用一张桌子?
感谢您的宝贵时间。
【问题讨论】:
-
Cassandra 的数据建模是一种不同的思维方式,采用冗余数据/查询表的方法是正确的。
-
@BryceAtNetwork23 - 谢谢。是的,有时很难绕开你的脑袋。感谢您的反馈。
-
@iamtheoracle 这很难。关键是要认识到需要一种不同的心态,并且你已经通过了那个障碍,所以你走在正确的道路上。比许多似乎从未“明白”的人更进一步。 :) 坚持下去,随着时间的推移,它会变得更有意义。
-
@DonBranson 感谢 20 多年使用“其他”主要数据库已经毁了我 :)
-
@iamtheoracle 呵呵。好吧,我已经编码足够长的时间了,以至于我记得上一次范式转变到 SQL数据库。
标签: cassandra cassandra-2.0 composite-primary-key