我们正在尝试在表格中存储特定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节点。
答案 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
希望它有所帮助。