21

Cassandraでデータバージョニングをどのように実装するかについての考えを共有できますか?

単純な名簿のレコードをバージョン管理する必要があるとします。(名簿レコードは、ColumnFamilyに行として保存されます)。私はその歴史を期待しています:

  • 使用頻度は低くなります
  • 「タイムマシン」方式でそれを提示するために一度に使用されます
  • 1つのレコードに対して数百を超えるバージョンはありません。
  • 履歴は期限切れになりません。

私は次のアプローチを検討しています:

  • アドレス帳をスーパーカラムファミリに変換し、複数のバージョンのアドレス帳レコードをスーパーカラムとして(タイムスタンプで)キー設定された1つの行に保存します。

  • 新しいスーパーカラムファミリを作成して、古いレコードまたはレコードへの変更を保存します。このような構造は次のようになります。

    {'名簿行キー':{'タイムスタンプ1':{'名':'新しい名前'、'変更者':'ユーザーID'、}、

    'time stamp2': {
            'first name': 'new name',
            'modified by': 'user id',
        },
    },
    

    '別の名簿行キー':{'タイムスタンプ':{...。

  • 新しいColumnFamillyに添付されたシリアル化された(JSON)オブジェクトとしてバージョンを保存します。バージョンのセットを行として、バージョンを列として表します。( CouchDBを使用した単純なドキュメントのバージョン管理をモデルにしています)

4

2 に答える 2

9

名簿のエントリが通常10,000未満であるという仮定を追加できる場合、スーパー列ファミリで名簿のタイムラインごとに1行を使用するのが適切なアプローチになります。

行は次のようになります。

{'address_book_18f3a8':
  {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}},
  {1290636018401680: {'entry1': 'entry1_stuff_v2', ...},
  ...
}

ここで、行キーは名簿を識別し、各スーパー列名はタイムスタンプであり、サブ列はそのバージョンの名簿の内容を表します。

これにより、1回のクエリで最新バージョンの名簿を読んだり、1回の挿入で新しいバージョンを書き込んだりすることができます。

名簿が10,000要素未満の場合にこれを使用することをお勧めする理由は、1つのサブ列を読み取る場合でも、スーパー列を完全に逆シリアル化する必要があるためです。全体として、この場合はそれほど悪くはありませんが、覚えておくべきことがあります。

別のアプローチは、名簿のバージョンごとに1つの行を使用し、次のように名簿ごとにタイムライン行を持つ個別のCFを使用することです。

{'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}}

ここで、some_uuid1とsome_uuid2は、これらのバージョンのアドレス帳の行キーに対応しています。このアプローチの欠点は、アドレス帳を読み取るたびに2つのクエリが必要になることです。利点は、名簿の選択した部分だけを効率的に読むことができることです。

于 2010-11-24T22:09:23.783 に答える
1

HBase(http://hbase.apache.org/)には、この機能が組み込まれています。試してみてください。

于 2013-03-18T12:59:22.323 に答える