相当于Pycassa中的ReferenceField?

2024-04-24 23:32:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着了解卡桑德拉/皮卡萨db设计。你知道吗

使用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 class 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 = ???

做这种事的首选方法是什么?显然,我可以将用户密钥放在Post-author字段中,但我希望有更好的方法在幕后处理所有这些,比如Mongoengine。你知道吗


Tags: namefromimportpostdocumentlengthmaxclass
2条回答

@jterrace是对的,你可能走错了路。在Cassandra中,你不太关心对象,它们之间的关系,以及如何规范化。相反,你必须问自己“我需要什么样的问题才能有效地回答?”,然后预构建这些查询的答案。这通常包括反规范化和“宽行”模型。我强烈建议您阅读一些关于Cassandra在线数据建模的文章。你知道吗

话虽如此,pycassa的ColumnFamilyMap只是一个薄薄的包装,可以减少样板间的工作量,仅此而已。它不会试图为任何复杂的问题提供支持,因为它不知道您需要回答什么类型的查询。因此,具体来说,您可以将匹配用户的lexicaluid存储在author字段中,但是当您获取Post对象时,pycassa不会自动为您获取该用户对象。你知道吗

我想你真的误解了卡桑德拉的数据模型。在继续之前,您应该阅读Cassandra Data Model。你知道吗

pycassa没有你上面定义的“对象”的概念。只有列族、行键类型和列类型。在《卡桑德拉》中,没有从一个列族到另一个列族的引用。你知道吗

相关问题 更多 >