【问题标题】:How to model a unique constraint in GAE ndb如何在 GAE ndb 中建模唯一约束
【发布时间】:2015-08-28 04:15:13
【问题描述】:

我想要几个“捆绑包”(Mjbundle),它们本质上是问题捆绑包(Mjquestion)。 Mjquestion 有一个整数“索引”属性,它需要是唯一的,但它应该只在包含它的包中是唯一的。我不确定如何正确地建模这样的东西,我尝试使用下面的结构化(重复)属性来做到这一点,但实际上并没有什么限制 Mjquestion 索引的唯一性。这样做更好/正常/正确的方法是什么?

class Mjquestion(ndb.Model):
    """This is a Mjquestion."""
    index = ndb.IntegerProperty(indexed=True, required=True)
    genre1 = ndb.IntegerProperty(indexed=False, required=True, choices=[1,2,3,4,5,6,7])
    genre2 = ndb.IntegerProperty(indexed=False, required=True, choices=[1,2,3])
    #(will add a bunch of more data properties later)

class Mjbundle(ndb.Model):
    """This is a Mjbundle."""
    mjquestions = ndb.StructuredProperty(Mjquestion, repeated=True)
    time = ndb.DateTimeProperty(auto_now_add=True)

(使用上述模型并获取了某个 Mjbundle 实体,我不确定如何根据索引快速从 mjquestions 中获取 Mjquestion。关于过滤结构化属性的解释看起来像是在 Mjbundle 类型级别上工作的,而我已经有一个 Mjbundle 实体并且不知道如何只快速查询该实体包含的问题,而不是在代码中“手动”循环它们。)

所以我愿意接受有关如何更好地做到这一点的任何建议。

  • 我阅读了这个信息性答案:https://stackoverflow.com/a/3855751/129202 它提供了一些关于可扩展性的想法,并且在相关说明中,我预计只有几个捆绑包,但每个捆绑包都会有数千个问题。

  • 也许我根本不应该使用 Mjbundle 的 mjquestions 属性,而是专注于养育:每个创建的 Mjquestion 都应该有一个特定的 Mjbundle 实体作为父代。然后通过执行祖先查询“手动”在“插入时”强制唯一性。

【问题讨论】:

  • 第一个问题是什么决定了您的用例的独特性。它是整数还是捆绑的其他方面。每个捆绑包都可以是一个子实体(此处讨论数据存储键),您让数据存储生成 id。它是独一无二的。在所有儿童中。
  • 你可以在maintain-uniqueness-of-a-property-in-the-ndb-database看到我的解决方案

标签: python google-app-engine unique google-cloud-datastore


【解决方案1】:

当您使用 StructuredProperty 时,所有类型的实体都存储为包含实体的一部分 - 因此,当您获取捆绑包时,您已经获取了所有问题。如果你坚持这种存储方式,那么迭代签入代码就是解决方案。

【讨论】:

  • 好吧,我想在我期望那里有数千个实体的情况下,这听起来不太可行。感谢您清除它。我将改用育儿方式。
猜你喜欢
  • 2011-02-07
  • 2016-11-19
  • 1970-01-01
  • 2022-01-22
  • 2014-02-23
  • 2012-07-30
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多