这个问题的一些答案涉及旧版Cassandra。这类问题的正确答案取决于您使用的Cassandra版本。
我有一个个人资料列系列,希望在每个个人资料中存储一系列技能。我不确定这是如何在Cassandra中完成的。一种选择是存储序列化的Thrift或protobuf,但我不想这样做,因为我认为Cassandra不了解这些格式,因此数据存储区中的数据不会是人类可读的或者从命令行通过CQL查询。我想到的另一个解决方案是使用超级列并将技能作为具有空值的键:
skills: {
'java': '',
'c++': '',
'cobol': ''
}
这是处理Cassandra列表的好方法吗?我想有一些我不知道的成语。我正在使用Astyanax客户端库,它只支持复合列而不是超级列 列,所以我在上面提出的解决方案在这种情况下看起来很尴尬。虽然我仍然在理解复合材料列时遇到一些麻烦,因为它们似乎尚未完全记录。这个解决方案是否适用于复合柱?
答案 0 :(得分:4)
这个答案可以追溯到Cassandra 1.2版本发布之前,它为处理列表提供了截然不同的功能。如果您使用Cassandra 1.2 +,答案可能不合适。
我会在列键中对列表进行编码,使用具有实际列名称的复合列作为第一维,即:
row_key -> {
[column_name; entry1] -> "",
[column_name; entry2] -> "",
...
}
然后,要读取列表,您需要从[column_name; ]到[column_name; ] - 注意空白尺寸。
关于这个的好处是它实际上很好地实现了一个集合;列表不能包含两次相同的东西。我认为这些可以在你的用例中使用。该列表也将按排序顺序维护。
答案 1 :(得分:3)
这个答案可以追溯到Cassandra 1.2版本发布之前,它为处理列表提供了截然不同的功能。如果您使用Cassandra 1.2 +,答案可能不合适。
正如邮件列表中所提到的,我的偏好对我来说非常有用,就是存储单个列“技能”,其值为序列化的JSON字符串。
真的归结为你对“技能”的使用模式。
答案 2 :(得分:3)
在旧版本的Cassandra中,您必须自己序列化列表并将其存储在列中,或者使用超级列。
Since version 1.2 of Cassandra,CQL3具有列的集合类型,因此您可以将list<text>
作为模式中列的类型。例如:
CREATE TABLE Person (
name text,
skills list<text>,
PRIMARY KEY (name)
);
如果您想自动消除重复项,可以使用set<text>
。