Google App Engine(NDB):一对一和一对多的关系

时间:2014-09-26 11:45:07

标签: django google-app-engine one-to-many google-cloud-datastore app-engine-ndb

我正在构建一个Web应用程序(Django和谷歌的NDB),现在必须构建我的模型。我已经阅读了很多关于如何实现一对多的例子但是 - 说实话 - 在阅读完这些内容后我现在更加困惑。

让我用类似的例子描述我的问题: 我有用户,每个用户都可以阅读多本书。用户可以随时停止阅读并保存进度。即使已完成一本书,也会保存进度并永不删除。

我需要检查用户已经开始阅读的所有书籍的进度,因此这必须是高效的,并且应该尽可能少地读取数据。书籍的数量不是太多(<1000)而且书籍也很薄(比如,只有一章,标题,作者就是这样)。由于每个用户都可能在每本书中都取得了自己的进步,所以我所担心的是进步的大量和进展的永久查找。

如何根据这些要求最好地构建模型?如果我在用户模型中使用StructuredProperty,那么在进行中引用的书籍的大小将计入X MB的限制(希望不是)?如果不是,我想这样的事情是最好的方法(我可以快速阅读进度,无需额外的查找,如果有必要从数据库中获取该书)。

class Book(ndb.model):
    name = ndb.StringProperty(required=True)
    ...

class Progress(ndb.model):
    book = ndb.KeyProperty(kind="Book", required=True)
    last_page_read = ndb.IntegerProperty(required=True, default=0)
    ...

class User(ndb.model):
    name = ndb.StringProperty(required=True)
    books_and_progress = ndb.StructuredProperty(Progress, repeated=True)
    ...

1 个答案:

答案 0 :(得分:1)

你的方法是正确的。当您使用结构化属性时,Progress实例不是单独的数据存储实体,它们存储在User实体中,因此不需要额外的查找来获取给定用户的进度信息。一旦有了用户,您还可以获得有关他正在阅读的书籍以及他离开的页面的所有信息。换句话说,您的用户实体将包含用户的名称和一个&#34; book key,last_page_read&#34;的列表。对。

  

将是大小的   在进度中引用的书籍计入X MB的限制   (希望不是)?

不知道您指的是哪个限制,但请记住,您实际拥有的用户实体中的内容是Book模型的关键,而不是本书的实际数据。因此,当您从数据存储中检索用户实例时,Book实例的大小不会受到影响。