【发布时间】:2016-10-30 01:31:42
【问题描述】:
Google Cloud Datastore / App Engine Datastore 允许实体拥有Key properties。他们有什么特别之处?
我问的原因是他们似乎在数据存储区中存储了额外的看似冗余的数据(例如 App ID)。如果我要推出自己的功能并将我的关键引用保存为字符串,我会错过哪些功能?
【问题讨论】:
标签: google-app-engine google-cloud-datastore
Google Cloud Datastore / App Engine Datastore 允许实体拥有Key properties。他们有什么特别之处?
我问的原因是他们似乎在数据存储区中存储了额外的看似冗余的数据(例如 App ID)。如果我要推出自己的功能并将我的关键引用保存为字符串,我会错过哪些功能?
【问题讨论】:
标签: google-app-engine google-cloud-datastore
使用KeyProperty 的一个优点是能够直接从数据存储区浏览器页面中的引用实体导航到相应的实体,在这些页面中,这些属性被识别并具有与之关联的链接(但前提是它们不是 重复属性)。
如果使用 Key IDs 代替 Jeff 的回答中提到的到达相应实体,则必须复制 ID,切换到其他实体类型并按相应 ID 搜索/过滤,这可能很乏味。
如果对到达相应实体的密钥使用其他编码,则更复杂,因为必须首先对 ID 或密钥进行解码。
【讨论】:
主要区别在于一个密钥包含了关于祖先的所有信息。因此,如果您有一个实体 Photo,它是实体 Album 的子实体,它是实体 User 的子实体,那么拥有 Photo 实体的键会更方便,因为您可以简单地调用 .get(key),否则您需要知道专辑和用户来重建密钥。
如果您的对象已经有父实体的 ID,或者如果您不使用父子关系,则存储 ID 占用的空间更少并且需要更少的带宽(例如要传输的较小的 JSON 对象),这可能很重要,也可能不重要为您的应用程序。
【讨论】:
关键属性没有什么特别之处。这只是通过在存储的密钥上调用.get() 来获取相关实体的一种便捷方式。
请注意,存储密钥不会存储应用 ID。如果您备份数据存储并将其恢复到其他应用程序,那么您存储的所有密钥都可以正常工作,因为它们不依赖于应用程序 ID。
在我的应用程序中,存储键的数字 id(在整数属性中)而不是键本身更方便。因为我知道那种,所以用get_by_id()代替get()很容易。
如何将密钥存储为字符串?我不希望您在这样做时看到任何显着的尺寸减小,但您可以尝试各种方式并使用技巧 here 比较实体大小。
【讨论】:
Key(Kind, ID)。重复的 Key 属性可能会有所不同,但这会很奇怪......