Pycassa中ReferenceField的等价物?

时间:2012-08-01 23:46:07

标签: python cassandra mongoengine pycassa

我正试图了解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类作者字段创建一个引用到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 = ???

做这样的事情的首选方式是什么?显然我可以把User键放在Post作者字段中,但是我希望有一些更好的方法可以在幕后处理所有这些,比如使用Mongoengine。

2 个答案:

答案 0 :(得分:1)

我认为你真的误解了Cassandra的数据模型。在继续之前,您应该阅读Cassandra Data Model

pycassa没有像上面定义的那样“对象”的概念。只有列族,行键类型和列类型。在卡桑德拉,没有从一个列族到另一个列的引用。

答案 1 :(得分:1)

@jterrace是正确的,你可能会以错误的方式解决这个问题。使用Cassandra,您不会过多关注对象,它们如何关联以及如何将其标准化。相反,您必须问自己“我需要哪些查询才能有效回答?”,然后预先为这些查询构建答案。这通常涉及非规范化和“宽行”模型的混合。我强烈建议你在线阅读一些关于Cassandra数据建模的文章。

据说,pycassa的ColumnFamilyMap只是一个薄的包装器,可以减少样板,仅此而已。它不会尝试为任何复杂的事情提供支持,因为它不知道您需要能够回答什么类型的查询。因此,具体来说,您可以将匹配的用户的LexicalUUID存储在作者字段中,但是当您获取Post对象时,pycassa将不会自动为您提取该User对象。