2010-01-09 77 views
1

我正在创建一个小问题应用程序,需要一些帮助来设计我的模型关系。这个问题可能会相当复杂,但我会尽量简洁。数据存储设计查询

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

我在想有一个Category类,每个ListProperty都会代表祖先树。它将按顺序包含树中每个父实体的键。但是,我是否应该在构造实体时指定父项,还是在这种情况下不需要?我想我可能不得不在交易中运行柜台更新,这就是为什么我正在考虑亲子关系。

或者也许有更优化的设计我的关系的方式,仍然可以让我保持每个类别中所有问题的相当准确的计数器。预先感谢您的帮助。

+0

稍微偏离主题,但我注意到,你将使用的应用程序引擎的数据存储。你有一些应用程序引擎和创建持久模型的经验吗?如果不是,我会指出App Engine的行为与许多其他Persisten模型有些不同。我发现使用App Engine时遇到了一些约束,而不像Hibernate(在Java世界中)那样更通用。例如查询属性路径,例如你无法查询triviaCard.someCategory.question。如果使用GAE – 2010-01-09 19:24:03

+0

,我只是想要将这些约束条件应用到您的设计中。我不确定这是否适用于您的评论,但我没有使用Java API。 – BMac 2010-01-09 19:34:44

回答

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 

通过保持两个子类别和所assocaited此类别中的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") 

...等...

+0

我只是看不到这是一个可扩展的选项。我可以在成千上万的测验中找到某个地方,而这看起来不像是存储在ListProperty中的逻辑密钥。我错了吗? – BMac 2010-01-09 21:51:35

+0

每个类别只存储它所属类别的关键字。 – 2010-01-09 22:05:34

+0

我指的是你的测验= db.ListProperty(db.Key)。这似乎是该类别中每个列表的关键,不是吗? – BMac 2010-01-09 22:25:23

0

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

而不是每个类别都有一个类,你有没有考虑一个CategoryList类,它会有一个incrementCategoryByName(str name)方法?该类包含一个类的字典,而不必为每个类别分配一个类的开销。

+0

不会有严格的2级方案。可能会出现以下情况:娱乐 - >电视 - > Seinfeld。 我对使用标签的担心是某些标签可能适用于多种类型的琐事。例如,内战可能是一个历史类别,但它也可能是电影的名称(如果存在的话)。 我会考虑您帖子的第二部分,并再次回复。 – BMac 2010-01-09 19:29:16

+0

关于你的文章的第二部分,我不认为这是可行的,因为标签可能不可行。有些情况下,不同树木中的分类会共享相同的名称。 – BMac 2010-01-09 19:31:34