如何在Cassandra中高效地存储此文档结构?

如何在Cassandra中高效地存储此文档结构?,cassandra,Cassandra,我想将这个复杂的文档结构迁移到cassandra: foo = { 1: { :some => :data, }, 2: { :some => :data }, ... 99 :{ :some => :data } 'seen' => {1 => 1347682901, 2 => 1347682801} } 问题是: 在~创建一个columnFamily中,它必须作为一行/记录可检索(可读)。并储

我想将这个复杂的文档结构迁移到cassandra:

foo = {
  1: {
    :some => :data,
  },
  2: {
    :some => :data
  },

  ...

  99 :{
    :some => :data
  }

  'seen' => {1 => 1347682901, 2 => 1347682801}
}
问题是:
在~创建一个columnFamily中,它必须作为一行/记录可检索(可读)。并储存如下

rowKey = foo

columnName           Value
-----------------------------------
1               {:some => :data,..}
2               {:some => :data,..}
...
...
99              {:some => :data,..}
seen            {1 => 1347682901, 2 => 1347682801}
1,2,。。。“看见”都是动态的

如果您担心只更新其中一列。这与在columnfamily中插入新列的方式相同。看这里

我还没有使用TTL。但事情就这么简单。在这里可以看到实现这一点的简单方法


更新


Q1.仅供我理解:你建议创建99个专栏吗?还是有可能保持这种活力

柱族与关系型数据库不同,具有灵活的结构。动态创建的行键可以有无限数量的列。例如:

myCcolumnFamily{
   "rowKey1": {
      "attr1": "some_values",
      "attr2": "other_value",
      "seen" : 823648223
   },
   "rowKey2": {
      "attr1": "some_values",
      "attr3": "other_value1",
      "attr5": "other_value2",
      "attr7": "other_value3",
      "attr9": "other_value4",
      "seen" : 823648223
   },
   "rowKey3": {
      "name"   : "naishe",
      "log"    : "s3://bucket42.aws.com/naishe/logs",
      "status" : "UNKNOWN",
      "place"  : "Varanasi"
   }
}
这是一篇古老的文章,值得一读:下面是一篇典型的引文,可以回答您的问题(我的重点):

我想指出的一点是,在这个
[ColumnFamily]
级别上没有强制的模式。这些行没有其包含的列的预定义列表。在上面的示例中,您可以看到键为“ieure”的行具有名称为“age”和“SEXT”的列,而键为“phatduckk”的行则没有。它是100%灵活的:一行可能有1989列,而另一行有2列。一行可能有一个名为“foo”的列,而其余的都没有。这是卡桑德拉的无模式方面

Q2.您建议将子结构序列化吗


这取决于你。如果不想序列化,可能应该使用SuperColumn。我的经验是这样的。如果列中的值表示部件无法单独访问的单元,请使用列。(这意味着序列化值)。如果列中有可能需要直接访问的支离破碎的子部分,请使用SuperColumn。

仅供我理解:您建议创建99列吗?还是有可能保持这种活力?你建议序列化子结构?谢谢!我想我会在一个动态列族中将我的结构扁平化到一个级别:seen:{1=>1347682901,2=>1347682801}变成seen--u 1:1347682901,seen--u 2:1347682801等等。这使得为每个值设置独立的ttl成为可能。你觉得这合理吗?是的。更像是
seen{foo:{1=>1347682901,2=>1347682801},bar:{1=>1347682901,2=>1347682801}
其中'seen'表示用户访问的CF,其中'foo',bar'是用户ID,1,2,3,…n表示第n次访问的列名,值是时间戳。对我来说是有意义的。嗯,但是如果我把“seen”放在另一个cf中,读起来会慢一些,对吗?我的意思是,我想用一个请求提取所有数据,这样保存在一行会更好吗?@Tobias原谅我的错误。我感到困惑的是,您希望在之前的评论中将存储视为不同的CF。您刚刚在CF中发布了一段列。因此,是的,这是有意义的
foo{“1”:“{'somedata':'val'},…”,“2”:“{'somedata':'val'},…,,,,,“seen_1”:1347682901,“seen_2”:1347682801,…”
myCcolumnFamily{
   "rowKey1": {
      "attr1": "some_values",
      "attr2": "other_value",
      "seen" : 823648223
   },
   "rowKey2": {
      "attr1": "some_values",
      "attr3": "other_value1",
      "attr5": "other_value2",
      "attr7": "other_value3",
      "attr9": "other_value4",
      "seen" : 823648223
   },
   "rowKey3": {
      "name"   : "naishe",
      "log"    : "s3://bucket42.aws.com/naishe/logs",
      "status" : "UNKNOWN",
      "place"  : "Varanasi"
   }
}