【问题标题】:Equivalent of ReferenceField in Pycassa?Pycassa中的ReferenceField等价物?
【发布时间】:2012-08-01 23:46:07
【问题描述】:

我正在尝试了解 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。

【问题讨论】:

    标签: python cassandra mongoengine pycassa


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,我昨天已经通读了一遍,但不幸的是,它的示例并不能让我全面了解您打算如何围绕 Cassandra 设计系统。我看到在没有引用的情况下做我想做的唯一方法是在数据库中复制大量数据。这对我来说似乎不是特别有效。 (而且我意识到,在这种情况下,可能只是我正在做的事情甚至不适合 Cassandra,但我怀疑我会被其他人强迫使用它。
      猜你喜欢
      • 2011-02-02
      • 2019-11-03
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多