在CQL3中为cassandra“table”选择正确的模式

时间:2013-11-04 21:48:02

标签: cassandra cql3

我们正在尝试在表格中存储特定profile_id的许多属性(使用CQL3),并且不能围绕哪种方法最好:

一个。 create table mytable(profile_id,a1 int,a2 int,a3 int,a4 int ... a3000 int)主键(profile_id);

OR

湾创建许多表,例如。 create table mytable_a1(profile_id,value int)主键(profile_id); create table mytable_a2(profile_id,value int)主键(profile_id); ... create table mytable_a3000(profile_id,value int)主键(profile_id);

OR

℃。 create table mytable(profile_id,a_all text)主键(profile_id); 并在a_all中存储3000个“列”,如: 插入mytable(profile_id,a_all)值(1,“a1:1,a2:5,a3:55,...... a3000:5”);

OR

d。以上都不是

我们将在此表上运行的查询类型: select * from mytable where profile_id in(1,2,3,4,5423,44)

我们尝试了第一种方法,查询保持超时,有时甚至杀死cassandra节点。

1 个答案:

答案 0 :(得分:2)

答案是使用聚类列。通过聚类列,您可以创建可用于保存属性名称(列名称)及其值(列值)的动态列。

表格是

create table mytable ( 
    profile_id text,
    attr_name text,
    attr_value int,
    PRIMARY KEY(profile_id, attr_name)
)

这允许您添加

等插入内容
insert into mytable (profile_id, attr_name, attr_value) values ('131', 'a1', 3);
insert into mytable (profile_id, attr_name, attr_value) values ('131', 'a2', 1031);
.....
insert into mytable (profile_id, attr_name, attr_value) values ('131', 'an', 2);

这将是最佳解决方案。

因为您想要执行以下操作 '我们将在此表上运行的查询类型:select * from mytable where profile_id in(1,2,3,4,5423,44)'

这需要6个查询,但cassandra应该能够立即执行此操作,尤其是如果您有多节点群集。

此外,如果您使用DataStax Java驱动程序,则可以在群集上异步并同时运行此请求。

有关数据建模和DataStax Java驱动程序的更多信息,请查看DataStax的免费在线培训。值得一看 http://www.datastax.com/what-we-offer/products-services/training/virtual-training

希望它有所帮助。