引用应用引擎数据存储区实体的首选方式:按键还是ID?

时间:2015-05-27 17:20:48

标签: google-app-engine google-cloud-datastore

App引擎数据存储区实体可以通过其密钥或(字符串或整数)ID进行引用。是否倾向于选择一个而不是另一个?

我可以看到使用键引用使管理界面更有用(引用的实体是可点击的),但它也需要更多的空间。

4 个答案:

答案 0 :(得分:1)

在这个特定的数据库中,我总是建议使用完整路径或Key来引用实体,因为id可以跨实体组重复;非常简单的例子:

Key('user', 1, 'post', 1)
Key('user', 2, 'post', 1)

这完全有效,如果您只存储帖子ID,则无法知道该实体属于哪个用户。

正如@ tx802提到的那样,开发总体上更容易,因为实体可以直接获取;即使你在客户端和服务器之间来回移动它们,也没有必要重新创建它们。

唯一的缺点可能是存储/带宽增加,但这只是处理“大数据”时的一个问题,即使这样也不太可能是一个重要的问题。

答案 1 :(得分:0)

所有实体都有一把钥匙。您之间的区别在于您是否应该使用

Key('Parent', 'dad', 'Child', 'ali')   # Name

Key('Parent', 'dad', 'Child', 1)   # ID

我会尽我所能使用Name。也就是说,如果您的实体具有唯一名称。在这个例子中,爸爸'可以只有一个孩子叫阿里'。密钥本质上是您的主要密钥(如果您想将其与SQL中的内容进行比较)。请注意,Key(' Parent',' dad2',' Child',' ali')是一个完全不同的密钥,并且是合法的。另请注意,爸爸'或者' dad2'如果您想存储“儿童”,则不需要存在于数据库中。实体。

当我拥有无法通过名称引用或其名称可能会更改的实体时,我会使用ID。实体的密钥可以永远不会更改。

我不会在键中使用空间。 IMO的成本效益不会影响可读性。

答案 2 :(得分:0)

在向用户显示信息时,我使用ID作为网址的一部分。带密钥的网址:

http://example.com/user/b3Bhdm90ZXIVCxIIRWxlY3Rpb24YgICAgIDQuwoM

比具有ID的网址更加丑陋:

http://example.com/user/5891733057437696

我没有使用祖先,所以我没有多个ID的问题,但我认为链接中的两个ID仍然比密钥短。

答案 3 :(得分:0)

对此的答案可能取决于您对迁移数据的需求与用户/人员的可见性之间的平衡:

  • 如果您可能需要在密钥中添加根或中间祖先 未来,需要现有的参考资料,以保持运作 使用密钥(或在客户端使用的网页安全密钥)。这确保了 现有数据继续有效。

  • 如果您无法保证唯一ID(例如使用递增) 或者生成的ids),你应该使用密钥。这是因为ids(和 名称)只需要在其父母中是唯一的。如果你使用 例如一个UUID,这不是一个问题。

  • 如果你的实体是短暂的,你想要整洁的网址,你可能只是 使用id / name。如果您通过电子邮件发送链接,或依赖它们 对于搜索引擎优化而言,你可能需要以某种方式编码密钥(再次, 如果您需要在实时系统中迁移数据)

根据我的经验,由于数据存储区的一些更独特的限制(每个实体组的写入限制和每个事务的实体组限制),数据迁移是一个真正的问题。这意味着您有时需要重新构建现有数据。您是否需要批量迁移或者不是真正归结为您首先如何存储关系。核心问题是您无法迁移外部保存的引用(电子邮件中的URL,SEO索引,api端点等),因此当您对实体密钥中的祖先“路径”进行假设时,您将破坏某些用户子集的功能。