1

この複雑なドキュメント構造を Cassandra に移行したいと考えています。

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

  ...

  99 :{
    :some => :data
  }

  'seen' => {1 => 1347682901, 2 => 1347682801}
}

問題: 1 つの行/レコードとして 5 ミリ秒未満で取得可能 (読み取り可能) である必要があります。

これまでのところ、データをシリアル化していますが、常に全体を更新する必要があるため、これは最適ではありません。

もう1つのことは、「見られた」ハッシュの値にcassandras ttl機能を使用したいということです。

サブ構造 (1..n) が cassandra でどのように機能するかについてのアイデアはありますか?それらは完全に動的ですが、1 つのクエリですべて読み取り可能である必要があります。

4

1 に答える 1

3

columnFamily を作成します。そして、次のように保存します

rowKey = foo

columnName           Value
-----------------------------------
1               {:some => :data,..}
2               {:some => :data,..}
...
...
99              {:some => :data,..}
seen            {1 => 1347682901, 2 => 1347682801}

1、2、...「見た」はすべて動的です。

これらの列の 1 つだけを更新することに不安がある場合。列ファミリーに新しい列を挿入する方法と同じです。Cassandraアップデートコラムはこちら

$column_family->insert('foo', array('42' => '{:some => :newdata,..}'));

まだTTLを使用する必要はありません。しかし、それはそれと同じくらい簡単です。ここでこれを達成するための非常に簡単な方法を参照してくださいCassandra 0.7+の期限切れの列


アップデート

Q1. 私の理解のために:99列を作成することをお勧めしますか? それとも、そのダイナミックさを維持することは可能ですか?

列ファミリーは、RDBMS とは異なり、柔軟な構造を持っています。動的に作成された行キーの列の数に制限はありません。例えば:

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"
   }
}

これは読む価値のある古い記事です: WTF は SuperColumn ですか? これはあなたの質問に答える典型的な引用です(私のものを強調してください):

私が指摘したいことの 1 つは、この[ColumnFamily]レベルで適用されるスキーマがないことです。行には、含まれる列の定義済みリストがありません。上記の例では、キー「ieure」を持つ行には「age」と「gender」という名前の列があり、キー「phatduckk」で識別される行にはありません。100% 柔軟です。1 つの行には 1,989 の列があり、もう 1 つの行には 2 つの列があります。1 つの行には「foo」という列があり、残りはありません。これは、Cassandra のスキーマレスな側面です。

. . . .

Q2. そして、サブ構造をシリアル化することをお勧めしますか?

それはあなた次第です。シリアル化したくない場合は、おそらく SuperColumn を使用する必要があります。私の経験則はこれです。列の値が、部分に個別にアクセスできない単位を表す場合は、Column を使用します。(つまり、値をシリアル化することを意味します)。列に断片化されたサブパーツがあり、直接アクセスする必要がある場合は、SuperColumn を使用します。

于 2012-09-15T05:15:10.963 に答える