我正在创建一个Trivia应用程序,需要一些帮助来设计我的模型关系。这个问题可能会相当复杂,但我会尽量简洁。
琐事问题都将成为特定类别的一部分。类别可以是另一类别中的类别。如果创建/删除了一个琐事问题,我需要确保我也更新了一个计数器。通过这种方式,我将能够看到每个类别中有多少问题,并将其显示给用户。如果某个类别具有“子”类别,我将需要一种显示所有子类别的累积计数器的方法。准确的计数相当重要,但不是关键任务。我不介意使用分片计数器。我的问题是,我应该如何设计它以便采用GAE非规范化并保持优化?
我正在考虑使用一个Category类,每个类都有一个ListProperty,它将代表祖先树。它将按顺序包含树中每个父实体的键。但是,我是否还应该在构造实体时指定父级,或者在这种情况下不需要父级?我想我可能必须在交易中运行我的计数器更新,这就是我考虑亲子关系的原因。
或许还有更优化的方式来设计我的关系,这仍然可以让我保持每个类别中所有问题的相当准确的计数器。提前感谢您的帮助。
答案 0 :(得分:0)
我对谷歌应用引擎并不熟悉,但这里有一些想法。首先要考虑的是“标签”是否比类别和标签更合适。子类别。他们是一个严格的2级别类别计划吗?所有项目都有主要和子类别分配吗?
您是否考虑过具有incrementCategoryByName(str name)方法的CategoryList类,而不是为每个类别创建一个类?该类包含类的字典,而不必为每个类别分配类的开销。
答案 1 :(得分:0)
这并不像你想象的那么复杂。这是一个类别类:
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中保留与此Category相关联的子类别和测验,获取它们的计数就像使用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")
...等...