我最近一直在阅读有关数据库查询中的连接如何减慢速度的问题.显然,Google App Engine甚至不允许使用它们.
我想知道人们如何设计一个没有连接的应用程序.例如,我正在开发一个拥有contacts
和的应用程序organizations
.联系人可以在许多组织中,组织可以有许多联系人.如果没有连接两个实体的第三个表,那怎么可能有这种关系......
contacts --< contacts_organizations >-- organizations
这是否意味着在GAE中你不能拥有多对多的关系?您只是遗漏了需要加入的功能?
我想你可以organizations
在contacts
表格中有一个TEXT 列,其中包含每个联系人的组织ID的空格分隔列表.这看起来有点奇怪.
加入速度慢的软件是一种神话,就像在应用程序代码中断言写入循环减慢软件一样神话般的神话.
我的意思是,为什么要写一个循环?这只是一次又一次地运行相同的代码行!还不够吗?这是一个巨大的浪费!
上述陈述具有讽刺意味.
我的观点是,查询包含一个用于目的的连接:获得正确的答案.低效或不必要地使用连接当然是糟糕的设计,比如将循环不变代码放在循环中.
避免连接作为一般策略是过早优化的一个例子.如果您编写高效代码的方法是提出类似的一揽子规则,那么避免连接并不会对您有所帮助.
至于Google App Engine,它确实支持实体之间的关系,但由于它不是严格意义上的关系数据库模型,因此连接的概念并未真正出现.相反,您可以从给定引用获取相关实体,这更像是模型的ORM接口,它与SQL中的连接不同.
您可以在此处阅读更多内容:http: //code.google.com/appengine/articles/modeling.html
(该链接在此主题的另一个答案中,但已被删除)
挑选点:Google不会在其数据库中禁止使用JOIN来阻止用户运行"昂贵"的查询; 数据库不是关系型的,因此"JOIN"SQL动词首先不适用.
通过这种方式,BigTable与Amazon的SimpleDB相同- 数据被非规范化并剥离了模式,因此您可以有效地使用存储桶中允许的任意数据的巨大,高效的哈希表.
这些哈希表非常容易扩展,特别是与关系数据库相比.对于像GAE这样的应用,极端可扩展性比完整功能集更高.