我正在使用Cassandra来存储股票信息。每一行'有一些基本字段,如:时间,价格,收盘价,开盘价,低价,高价等。在这些字段的顶部,我有一个浮点型值列表,其中包含一些内部系统计算。
对象示例:
Class stockentry
time timestamp;
price float;
close float;
open float;
low float;
high float;
x float;
y float;
z float;
xx2 float;
xx3 float;
xx... yy... z...
a lot more...
在列系列中创建大量列并存储所有这些数据对于Cassandra来说没有问题。问题在于查询它。 我想查询x,y,xx2等字段,这些字段包含一个非常独特的数据值(浮点数有4个小数位)。
将所有这些列(100-150)添加为二级索引可能不是一个好的解决方案,而且Cassandra文档不推荐这样做。
使用Cassandra时,考虑到要求,推荐的数据建模是什么?
答案 0 :(得分:2)
Cassandra数据建模遵循查询驱动设计模式。这意味着,我们不是构建一个模型来自然地表示数据(就像我们在RDBMS中那样),而是设计模式来代替数据访问模式。
例如,如果您知道大多数查询都会在 x 列上包含 where 子句,并按列中的行排序y ,您可能想要创建一个其他表,其中分区键是 x ,而群集列是 y 。例如:
CREATE TABLE <tablename>
"x" float,
"y" float,
"price" float,
.
.
<rest of columns>
.
.
PRIMARY KEY("x","y"));
现在,在x列中查询变得非常有效,因为x的特定值的数据存储在一起。
对于需要一系列值的查询(x> pricerange),最好将它们存储为聚类列。
不可否认,这会导致多次写入,因为列x和y中的值必须跨两个表写入。 Cassandra鼓励写作,因为在这个时代存储数据很便宜。从本质上讲,在Cassandra中,您可以通过额外的写入来进行快速读取。
因此,在设计数据模型之前,请考虑您最有可能进行的查询和相应的设计。
答案 1 :(得分:0)
CREATE TABLE pricing(
id blob,
price_tag string, // open, close, high, low, ...
time timestamp,
value float, // I would suggest blob with custom/thrift serialization
PRIMARY KEY (id, price_tag, time)
)
随着时间的推移,它将为不同的价格类型提供非常有效的查询。
您可以在精彩的演示文稿中找到更多内容:http://www.slideshare.net/carlyeks/nyc-big-tech-day-2013?ref=http://techblog.bluemountaincapital.com/