【问题标题】:Datastore Design Inquiry数据存储设计查询
【发布时间】:2010-01-09 19:13:14
【问题描述】:

我正在创建一个 Trivia 应用,需要一些帮助来设计我的模型关系。这个问题可能会变得相当复杂,但我会尽量简洁。

琐事问题都属于特定类别。类别可能是另一个类别中的一个类别。如果创建/删除了一个琐事问题,我需要确保我也更新了一个计数器。通过这种方式,我将能够查看每个类别中有多少问题,并将其显示给用户。如果一个类别有“子”类别,我将需要一种显示所有子类别的累积计数器的方法。准确的计数相当重要,但不是关键任务。我不介意使用分片计数器。我的问题是,我应该如何设计它以使其采用 GAE 非规范化并保持优化?

我正在考虑创建一个 Category 类,其中每个类都有一个 ListProperty,它将代表祖先树。它将按顺序包含树中每个父实体的键。但是,在构造实体时我是否也应该指定父级,还是在这种情况下不需要?我在想我可能必须在事务中运行我的计数器更新,这就是我考虑父子关系的原因。

或者也许有更优化的方式来设计我的关系,这样我仍然可以相当准确地计算每个类别中的所有问题。提前感谢您的帮助。

【问题讨论】:

  • 有点离题,但我注意到您将使用应用程序引擎作为数据存储。你有一些应用引擎和创建持久模型的经验吗?如果不是,我会指出 App Engine 的行为与许多其他持久模型略有不同。我发现在使用 App Engine 时会遇到一些限制,而不是像 Hibernate(在 Java 世界中)这样更通用的东西。例如查询属性路径,例如您无法查询 triviaCard.someCategory.question。如果使用 GAE,请注意将这些约束纳入您的设计
  • 我不确定这是否适用于您的评论,但我没有使用 Java API。

标签: python database-design google-app-engine


【解决方案1】:

这并不像您想象的那么复杂。这是一个类别类:

class Category(db.Model):
    title = db.StringProperty()
    subcategories = db.ListProperty(db.Key)
    quizzes = db.ListProperty(db.Key)

    def add_sub_category(self, title):
        new_category = Category(title)
        new_category.put()
        self.subcategories.append(new_category)
        self.put()

        return new_category

通过将与此类别相关的子类别和测验都保存在 ListProperty 中,获取它们的数量就像使用 len() 运算符一样简单。

你可以像这样使用它:

main_category = Category("Main")
main_category.put()

sports_category = main_category.add_sub_category("Sports")
baseball_category = sports_category.add_sub_category("Baseball")
football_category = sports_category.add_sub_category("Football")
hockey_category = sports_category.add_sub_category("Hockey")

tv_category = main_category.add_sub_category("TV")

...等等...

【讨论】:

  • 我只是看不出这是一个可扩展的选项。我可以在成千上万个测验中的某个地方,这似乎不像是存储在 ListProperty 中的合乎逻辑的键数量。我错了吗?
  • 每个 Category 只存储它作为父类的类别的键。
  • 我指的是你的测验 = db.ListProperty(db.Key)。这似乎是该类别中每个列表的关键,不是吗?
  • 真的吗?每个类别有数千个测验?
  • 会有测验和独立问题。即使 ListProperty 中的 100 多个键似乎也容易失败。
【解决方案2】:

我对 Google App Engine 不太熟悉,但这里有一些想法。首先是考虑“标签”是否比类别和子类别更合适。他们会是一个严格的 2 级类别计划吗?所有项目都有主类别和子类别分配吗?

您是否考虑过一个具有 incrementCategoryByName(str name) 方法的 CategoryList 类,而不是为每个类别创建一个类?该类包含一个类字典,而不必为每个类别产生一个类的开销。

【讨论】:

  • 不会有严格的 2 级方案。可能有类似的情况:娱乐->电视->宋飞。我对使用标签的担心是某些标签可能适用于不止一种类型的琐事。例如,Civil War 可能是一个历史类别,但它也可能是一部电影的名称(如果存在的话)。我会考虑您帖子的第二部分,并再次回复。
  • 关于您帖子的第二部分,我认为这不可行,原因与标记可能不可行的原因相同。在某些情况下,不同树中的类别会使用相同的名称。
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多