例如,Google App Engine 使用 Google Datastore(而非标准数据库)来存储数据。有人对使用 Google Datastore 而不是数据库有任何提示吗?似乎我已经训练我的思维 100% 思考直接映射到表结构的对象关系,现在很难看到任何不同的东西。我可以理解 Google Datastore 的一些好处(例如性能和分发数据的能力),但是牺牲了一些好的数据库功能(例如连接)。
与 Google Datastore 或 BigTable 合作过的人是否对与他们合作有什么好的建议?
与“传统”关系数据库相比,App Engine 数据存储区有两点需要习惯:
要实现的关键——以及这两种差异背后的原因——是 Bigtable 基本上就像一个巨大的有序字典。因此,put 操作只是设置给定键的值 - 无论该键的任何先前值如何,并且 fetch 操作仅限于获取单个键或键的连续范围。索引可以实现更复杂的查询,索引基本上只是它们自己的表,允许您将更复杂的查询实现为对连续范围的扫描。
一旦你吸收了这些,你就拥有了理解数据存储的功能和限制所需的基本知识。看似武断的限制可能更有意义。
这里的关键是,尽管这些限制了您可以在关系数据库中执行的操作,但这些相同的限制使得扩展到 Bigtable 旨在处理的那种数量级变得切实可行。您根本无法执行在纸面上看起来不错但在 SQL 数据库中速度极慢的那种查询。
就如何改变数据表示方式而言,最重要的是预先计算。不要在查询时进行连接,而是尽可能预先计算数据并将其存储在数据存储中。如果要选择随机记录,请生成一个随机数并将其与每条记录一起存储。这里有一整本关于这种技巧和窍门的食谱。