【问题标题】:KeyProperty or IntegerID Look-up to Model One-to-Many Relationship Google App EngineKeyProperty 或 IntegerID 查找模型一对多关系 Google App Engine
【发布时间】:2016-08-11 22:40:17
【问题描述】:

这可能是一个超级愚蠢的问题,但这里是:

在 App Engine 上,如果我想为一对多关系建模,我应该将引用的实体存储为 KeyProperty,还是应该简单地将实体的 numericID(由 App Engine 自动生成)存储为整数属性?

例如:

class Book(ndb.Model):
    author = ndb.KeyProperty(kind=Author)

class Author(ndb.Model):
    name = ndb.StringProperty()

或者:

class Book(ndb.Model):
    author_id = ndb.IntegerProperty()

class Author(ndb.Model):
    books = ndb.StringProperty()

在第二个例子中,如果我想得到一本书的作者,我可以这样做:

key = ndb.Key('Author', Book.author_id)
author = key.get()

一种方法会比另一种更有效吗?如果应用程序规模很大,例如一个作者可以拥有 100 万本书,而我需要查询该作者的所有书籍,那么一种方法会比另一种更有效吗?

我倾向于第二种方式,只是因为我觉得存储ID而不是复杂的Key对象会更少存储,特别是如果我需要输出JSON,很难序列化Key对象

【问题讨论】:

    标签: python google-app-engine one-to-many


    【解决方案1】:

    有一种方法可以从键生成 Web 安全字符串,但键确实比 ID 占用更多空间。没有理由使用 Keys 进行引用,除了一些罕见的用例,当您需要知道父实体并决定存储完整密钥比传递实体的 ID 和父实体的 ID 更容易(甚至可能父母的父母)每次。

    此外,如果一个属性包含在复合索引中,则大小的差异会变得更加显着。

    【讨论】:

    • 感谢您的回复!假设我在书籍上有一个属性,例如页面 (IntegerProperty),我想按该属性排序。因此,我必须查询所有具有作者数字 ID 的书籍,然后按页数对所有书籍进行排序。对于非常大规模的应用程序,您会推荐第二种方法(存储数字 ID)吗?
    • 在性能上不会有太大差异——只是因为数据较短而有一点差异。此外,如果您正确地进行查询,那么您有 100 本书还是 100 万本书都没关系 - 没有理由找到超过一页的结果。主要区别在于存储空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多