如何让Cassandra为特定的行键设置不同的列键?

时间:2014-03-26 00:30:12

标签: cassandra cql cassandra-2.0

我正在阅读以下关于Cassandra的文章:

http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/#.UzIcL-ddVRw

它似乎意味着你可以在cassandra中为给定的行键设置不同的列键。真的吗?如果是真的,你如何允许变化的行键。

我认为这可能是真的原因是因为我们有一个用户,它可以喜欢很多项目,我们只想让userId成为rowkey。我们将此rowKey(userID)映射到特定用户可能喜欢的所有项目。每个特定用户可能喜欢不同数量的项目。因此,如果我们可以有多个列密钥,每个用户喜欢的每个itemID一个,那么我们可以通过这种方式解决问题。

因此,是否可以为特定的rowKey设置不​​同长度的cassandra列密钥? (以及如何做到这一点)

提供一个示例和/或一些cql代码会很棒!

让我感到困惑的是,我已经看到了一些.cql文件并且他们事先定义了键空间,并且它似乎非常不灵活,如何使其动态化,即允许它随意添加其他列。例如:

CREATE TABLE IF NOT EXISTS results (
    test blob,
    tid timeuuid,
    result text,
    PRIMARY KEY(test, tid)
);

这怎么可能允许增长列?我们不需要事先指定名称吗?或者根据应用程序的需要添加其他自定义列?

2 个答案:

答案 0 :(得分:2)

是的,每行row_key可以有不同数量的列。从关系的角度来看,tid是变量的名称并不明显。它充当变量列键的占位符。请注意以下插入语句中的" tid","结果"和"数据"在声明中从未提及。

CREATE TABLE IF NOT EXISTS results (
    data blob,
    tid timeuuid,
    result text,
    PRIMARY KEY(test, tid)
);

因此,在您的示例中,您需要标识表的row_key,column_key和payload。 主键包含row_key和column_key。

测试是你的row_key。 tid是你的column_key。 数据是你的有效载荷。

以下插入内容均有效:

INSERT your_keyspace.results('row_key_1', 'a4a70900-24e1-11df-8924-001ff3591711', 'blob_1');
INSERT your_keyspace.results('row_key_1', 'a4a70900-24e1-11df-8924-001ff3591712', 'blob_2');
#notice that the column_key changed but the row_key remained the same
INSERT your_keyspace.results('row_key_2', 'a4a70900-24e1-11df-8924-001ff3591711', 'blob_3');

请参阅here

答案 1 :(得分:1)

你有没有想过在cassandra中探索收集支持以便以共处方式处理这种关系(例如。在同一数据节点上}。

不确定它是否有帮助,但是将用户ID保存为行键以及包含项ID为关键字和某些值的地图呢?

-Vivel