Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据存储设计查询_Python_Database Design_Google App Engine - Fatal编程技术网

Python 数据存储设计查询

Python 数据存储设计查询,python,database-design,google-app-engine,Python,Database Design,Google App Engine,我正在创建一个琐事应用程序,需要一些帮助来设计我的模型关系。这个问题可能会变得相当复杂,但我会尽量简明扼要 琐事问题都属于某一特定类别。类别可以是另一个类别中的类别。如果创建/删除了琐事问题,我需要确保我还更新了计数器。通过这种方式,我将能够看到每个类别中有多少个问题,并将其显示给用户。如果一个类别有“子”类别,我需要一种显示所有子类别的累积计数器的方法。准确的计数相当重要,但不是关键任务。我不介意使用碎片计数器。我的问题是,我应该如何设计它,使其采用GAE非规范化,并保持优化 我想创建一个Ca

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

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

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


或者,也许有一种更优化的方式来设计我的人际关系,它仍然允许我对每个类别中的所有问题保持相当准确的计数器。提前感谢您的帮助。

我对谷歌应用程序引擎不太熟悉,但这里有一些想法。首先是考虑“标签”是否比类别和子类别更合适。他们会是一个严格的2级分类方案吗?所有项目是否都有主类别和子类别分配


您是否考虑过一个CategoryList类,它将具有incrementCategoryByName(str name)方法,而不是为每个类别提供一个类?该类包含一个类字典,而不必为每个类别增加类的开销。

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

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")

…等等…

有点离题,但我注意到您将使用app engine作为数据存储。您是否有使用AppEngine和创建持久模型的经验?如果不是的话,我会指出AppEngine的行为与许多其他persisten模型稍有不同。我发现,与Hibernate(在Java世界中)等更通用的东西相比,在使用AppEngine时,您会遇到一些限制。例如查询属性路径,例如无法查询triviaCard.someCategory.question。如果使用GAEI,我不确定这是否适用于您的评论,但我不使用Java API。不会有严格的两级方案。可能有这样的例子:娱乐->电视->宋飞。我对使用标签的担心是,某些标签可能适用于多种类型的琐事。例如,内战可能是一个历史范畴,但也可能是一部电影的名称(如果有)。我会考虑你的帖子的第二部分,并再次回复。关于你的帖子的第二部分,我认为这是可行的,因为同样的原因,标签可能是不可行的。在某些情况下,不同树中的类别可能会共享相同的名称。我只是不认为这是一个可伸缩的选项。我可能有数千个测验中的某个地方,而这似乎并不是一个存储在ListProperty中的合理数量的键。我错了吗?每个类别只存储它所属类别的键。我指的是您的测验=db.ListProperty(db.Key)。这似乎是该类别中每个列表的关键,不是吗?真的吗?每个类别有数千个测验?将有测验和独立问题。即使ListProperty中有100多个键似乎也容易失败。