我正试图了解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。
答案 0 :(得分:1)
我认为你真的误解了Cassandra的数据模型。在继续之前,您应该阅读Cassandra Data Model。
pycassa没有像上面定义的那样“对象”的概念。只有列族,行键类型和列类型。在卡桑德拉,没有从一个列族到另一个列的引用。
答案 1 :(得分:1)
@jterrace是正确的,你可能会以错误的方式解决这个问题。使用Cassandra,您不会过多关注对象,它们如何关联以及如何将其标准化。相反,您必须问自己“我需要哪些查询才能有效回答?”,然后预先为这些查询构建答案。这通常涉及非规范化和“宽行”模型的混合。我强烈建议你在线阅读一些关于Cassandra数据建模的文章。
据说,pycassa的ColumnFamilyMap只是一个薄的包装器,可以减少样板,仅此而已。它不会尝试为任何复杂的事情提供支持,因为它不知道您需要能够回答什么类型的查询。因此,具体来说,您可以将匹配的用户的LexicalUUID存储在作者字段中,但是当您获取Post对象时,pycassa将不会自动为您提取该User对象。