0

Cassandra/Pycassaデータベースの設計に頭を悩ませようとしています。

Mongoengineでは、次のように「ReferenceField」を使用して別のクラスを参照できます。

from mongoengine import *

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)

ドキュメントからわかる限り、Pycassaに相当するものは次のようなものですが、PostクラスのauthorフィールドからUserクラスへの参照を作成する方法がわかりません。

from pycassa.types import *
from pycassa.pool import ConnectionPool
from pycassa.columnfamilymap import ColumnFamilyMap
import uuid

class User(object):
    key = LexicalUUIDType()
    email = UTF8Type()
    first_name = UTF8Type()
    last_name = UTF8Type()

class Post(object):
    key = LexicalUUIDType()
    title = UTF8Type()
    author = ???

このようなことをするための好ましい方法は何ですか?もちろん、[投稿者]フィールドにユーザーキーを入力することもできますが、Mongoengineのように、これらすべてを舞台裏で処理するより良い方法があることを望んでいます。

4

2 に答える 2

1

あなたはカサンドラのデータモデルを本当に誤解していると思います。続行する前に、 Cassandraデータモデルをお読みください。

pycassaには、上記で定義したような「オブジェクト」の概念はありません。列ファミリー、行キータイプ、および列タイプのみがあります。Cassandraには、ある列ファミリーから別の列ファミリーへの参照などはありません。

于 2012-08-02T01:36:19.370 に答える
1

@jterraceは正しいです、あなたはおそらくこれを間違った方法で行っているでしょう。Cassandraを使用すると、オブジェクト、それらがどのように関連するか、およびそれを正規化する方法についてあまり気にする傾向がありません。代わりに、「効率的に回答するにはどのクエリが必要ですか?」と自問し、それらのクエリに対する回答を事前に作成する必要があります。これには通常、非正規化と「ワイド行」モデルの混合が含まれます。Cassandraのデータモデリングに関するいくつかの記事をオンラインで読むことを強くお勧めします。

そうは言っても、pycassaのColumnFamilyMapは、ボイラープレートを削減できる単なる薄いラッパーであり、それ以上のものではありません。答える必要のあるクエリの種類がわからないため、複雑なもののサポートを提供しようとはしません。したがって、具体的には、一致するユーザーのLexicalUUIDを作成者フィールドに格納できますが、Postオブジェクトをフェッチするときに、pycassaはそのユーザーオブジェクトを自動的にフェッチしません。

于 2012-08-02T17:10:12.160 に答える