0

私はcqlengineを使用していますが、疑問はほとんどありませんでした:

次のように定義されたモデルがある場合

class Contact(Model):
   street = columns.Text()
   city = columns.Text()

このようなことはできますか

  1. 以下のコードに記載されている連絡先モデルへの参照

    class User(Model):

      contact = Contact()
      first_name =coloumns.Text()
      .....`
    
  2. リストとしてのユーザーモデルへの参照:

    クラス会社(モデル): users = columns.List(User()) .....

必要な機能を達成するための正しい方法はありますか、それとも他の方法ですか?

4

1 に答える 1

1

あまり。Cassandra には外部キー関係の概念がないため、cqlengine にもありません。このようなリレーションシップを cassandra でモデル化する場合、リレーションシップの動作に応じて、使用できるアプローチがいくつかあります。

1 つ目は、データを複製することです。ユーザーをアドレスに関連付ける場合、完全なアドレスをユーザー テーブルに保存するのが理にかなっている場合があります。変更されないもの (123 A ストリートが魔法のように 456 B ストリートに移動しない) の場合、これは理にかなっています。ユーザーが場所を移動した場合は、ユーザー テーブルを更新するだけです。

2 つ目は、連絡先の場所ごとに一意の ID を持ち、関連する ID をユーザー モデルに (通常はセットで) 保存することです。これは、関連する 2 つのエンティティが互いに独立して変更され、何かが変更されるたびに複製されたデータを取り出して更新するオーバーヘッドがアプリケーションにとって高すぎる場合に適しています。

3 番目は 2 番目の方法のバリエーションで、関連する ID が結合テーブルとして機能する別のテーブルに格納されます (user_id -> contact_id)。

いずれにせよ、cassandra/cqlengine を使用する際に覚えておくべき最も重要なことは、データをモデル化してクエリに答えるということです。データの複製は問題ありません。RDBMS の場合のようにデータをモデル化しようとしないでください。

于 2014-08-11T16:15:23.347 に答える