例如,Google App Engine 使用 Google Datastore(而不是标准数据库)来存储数据。有人对使用 Google Datastore 而不是数据库有什么建议吗?看来我已经训练自己的思维 100% 思考直接映射到表结构的对象关系,现在很难看到任何不同的东西。我可以理解 Google Datastore 的一些好处(例如性能和分发数据的能力),但牺牲了一些良好的数据库功能(例如联接)。
使用过 Google Datastore 或 BigTable 的人对于使用它们有什么好的建议吗?
与“传统”关系数据库相比,App Engine 数据存储有两点需要习惯:
- 数据存储区不区分插入和更新。当您对实体调用 put() 时,该实体将以其唯一键存储到数据存储中,并且具有该键的任何内容都会被覆盖。基本上,数据存储中的每个实体类型都像一个巨大的地图或排序列表。
- 正如您所提到的,查询受到的限制要大得多。首先,没有加入。
需要认识到的关键一点——以及这些差异背后的原因——是 Bigtable 基本上就像一个巨大的有序字典。因此,放置操作只是设置给定键的值 - 无论该键之前的任何值如何,而获取操作仅限于获取单个键或连续范围的键。使用索引可以实现更复杂的查询,索引基本上只是它们自己的表,允许您在连续范围上扫描时实现更复杂的查询。
一旦您掌握了这一点,您就具备了了解数据存储的功能和限制所需的基本知识。看似武断的限制可能更有意义。
这里的关键是,尽管这些是对您在关系数据库中可以执行的操作的限制,但这些相同的限制使得扩展到 Bigtable 设计处理的那种规模变得切实可行。您根本无法执行那种在纸上看起来不错但在 SQL 数据库中却慢得要命的查询。
就如何改变数据的表示方式而言,最重要的是预先计算。不要在查询时进行连接,而是预先计算数据并尽可能将其存储在数据存储中。如果您想选择随机记录,请生成一个随机数并将其与每条记录一起存储。有一本关于此类提示和技巧的完整食谱here https://web.archive.org/web/20090416113704/http://appengine-cookbook.appspot.com/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)