1

我有嵌套的数据 -

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) 这样的复合列将中断。

有什么建议么........

4

2 回答 2

1

您是否考虑过使用地图/字典作为列类型?这篇文章解释了 Cassandra 中可用的不同集合类型

于 2013-08-18T08:39:54.193 回答
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';
于 2013-08-10T16:46:45.593 回答