Google App Engine 数据存储 - 键与标识符

Google App Engine Datastore - Keys vs. Identifiers

我有几次 运行 做出的一个决定是如何处理实体的密钥或嵌入式 ID 的传递。考虑到使用数据存储密钥内置的编码器和编组方法,每个似乎都同样可行,但我想知道是否有关于此选择的任何最佳实践。一个示例可能是 URL 访问用户的文件,其中用户具有默认的自动生成的数字 ID,格式为:website.com/users/{userIdentifier}/files

我正在尝试确定数据存储区键中嵌入的数字是否优于实际键字符串本身。在野外使用数据存储密钥是否安全?我想标准化我们在整个系统中处理这些标识符的方式,并且想知道是否有这方面的最佳实践。

使用完整密钥而不是标识符的唯一原因是在不传递附加数据的情况下获取嵌入密钥本身的祖先信息。虽然这在某些情况下可能很方便,但我认为将键用作应用程序中的标准引用方法的优势还不够大。

使用标识符的优势更为明显:(a) 它们更小,并且 (b) 它们不会泄露有关其祖先的任何信息(这可能是也可能不是问题)。

较小的大小经常发挥作用:您可能想在 URL 中使用一个 id,在 memcache 中保存一个 id 列表(有 1MB 的限制)等。

数据存储键包含(至少)下一个信息:

  • 善良
  • 参考祖先
  • 字符串或整数 ID

你真的 need/want 传入 URL 还是保留你的数据库 AppID 和种类?

比较这 2 个 url(从逻辑上讲,如果是密钥,它可能会用 urlsafe() 编码):

  • /订单列表?user=123
  • /订单列表?user=User/123

或这 2 个字段:

Table: Orders
---------------------
| UserKey  | UserID |
---------------------
| User/123 | 123    |
---------------------

您为什么要保留和传递有关应用和类型的重复信息?通常,您的应用会引用自己的实体,并且种类由列或参数名称得知。

除非您在几个应用之间构建一些 orchestration/integration,否则仅使用 ID 会更有效。