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 类作者字段到 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 author 字段中,但我希望有更好的方法可以在幕后处理所有这些,例如使用 Mongoengine。

4

2 回答 2

1

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

pycassa 没有你上面定义的“对象”的概念。只有列族、行键类型和列类型。在 Cassandra 中,不存在从一个列族到另一个列族的引用。

于 2012-08-02T01:36:19.370 回答
1

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

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

于 2012-08-02T17:10:12.160 回答