小编典典

如何在数据存储而不是数据库中思考?

all

例如,Google App Engine 使用 Google Datastore(而非标准数据库)来存储数据。有人对使用 Google Datastore
而不是数据库有任何提示吗?似乎我已经训练我的思维 100% 思考直接映射到表结构的对象关系,现在很难看到任何不同的东西。我可以理解 Google
Datastore 的一些好处(例如性能和分发数据的能力),但是牺牲了一些好的数据库功能(例如连接)。

与 Google Datastore 或 BigTable 合作过的人是否对与他们合作有什么好的建议?


阅读 113

收藏
2022-07-31

共1个答案

小编典典

与“传统”关系数据库相比,App Engine 数据存储区有两点需要习惯:

  • 数据存储区不区分插入和更新。当您在实体上调用 put() 时,该实体将使用其唯一键存储到数据存储中,并且具有该键的任何内容都会被覆盖。基本上,数据存储中的每种实体类型都像一个巨大的地图或排序列表。
  • 正如您所提到的,查询受到更多限制。没有加入,首先。

要实现的关键——以及这两种差异背后的原因——是 Bigtable 基本上就像一个巨大的有序字典。因此,put 操作只是设置给定键的值 -
无论该键的任何先前值如何,并且 fetch
操作仅限于获取单个键或键的连续范围。索引可以实现更复杂的查询,索引基本上只是它们自己的表,允许您将更复杂的查询实现为对连续范围的扫描。

一旦你吸收了这些,你就拥有了理解数据存储的功能和限制所需的基本知识。看似武断的限制可能更有意义。

这里的关键是,尽管这些限制了您可以在关系数据库中执行的操作,但这些相同的限制使得扩展到 Bigtable
旨在处理的那种数量级变得切实可行。您根本无法执行在纸面上看起来不错但在 SQL 数据库中速度极慢的那种查询。

就如何改变数据表示方式而言,最重要的是预先计算。不要在查询时进行连接,而是尽可能预先计算数据并将其存储在数据存储中。如果要选择随机记录,请生成一个随机数并将其与每条记录一起存储。这里有一整本关于这种技巧和窍门的食谱

2022-07-31