嵌套结构cassandra的columnfamily设置

时间:2013-08-10 00:35:37

标签: model cassandra

我的数据嵌套为 -

a -> bb (multiple columns name values for bb)
a -> bb -> ccc (multiple columnn name values for ccc)
a -> bb -> ddd (multiple columnn name values for ddd)
a -> cc -> eee (multiple columns name values for eee)
p -> qq
p -> qq -> rrr 
p -> qq -> rrr -> ssss -> ttttt......
....

对于输入'a',我需要将所有内容都放在'a'下。 对于'bb'输入'bb'下的所有内容等等。

对嵌套没有明确限制,在cassandra中建模的最佳方法是什么。 对于复合柱,我需要提前了解多少嵌套级别,所以我不确定这些是否能很好地解决。 即,如果我遇到更多的嵌套结构,像(a:bb:ccc)这样的复合列将会中断。

任何建议........

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用maps / dicts作为列类型?这个post解释了Cassandra中可用的不同集合类型

答案 1 :(得分:0)

这看起来像一个图形数据库。您应该使用titan db http://thinkaurelius.github.io/titan/,它在Cassandra上实现了一个图形数据库。

如果您想自己重新发明它,只要您想要插入某些内容,就可以使用不同的键前缀多次插入它。所以要插入p -> qq -> rrr -> ssss -> ttttt

插入:

p : qq -> rrr -> ssss -> ttttt
p -> qq : rrr -> ssss -> ttttt
p -> qq -> rrr : ssss -> ttttt
p -> qq -> rrr -> ssss : ttttt
p -> qq -> rrr -> ssss -> ttttt : <empty>

理论上你可以使用代码中的“DynamicComposite”类型来获得可变长度元组,但这会使命令行工具中使用数据库,或者除了代码之外的任何东西都更难。可能更好地使用带分隔符的字符串。还要使用批处理,以使写入全部失败或一起成功。

begin batch
insert into XYZ (prefix, suffix) values ('p', 'qq:rrr:ssss:ttttt');
insert into XYZ (prefix, suffix) values ('p:qq', 'rrr:ssss:ttttt');
insert into XYZ (prefix, suffix) values ('p:qq:rrr', 'ssss:ttttt');
insert into XYZ (prefix, suffix) values ('p:qq:rrr:ssss', 'ttttt');
insert into XYZ (prefix) values ('p:qq:rrr:sass:ttttt');
apply batch;

然后获取p->qq->rr下的所有值:

select * from XYZ where prefix = 'p:qq:rrr';