在我看来,关系型数据库是一种基本工具,用来规避风险。现代计算机和RDBMS都经过了充分的优化,因此您可以在单个服务器上容纳相当大的数据量。通过选择 RDBMS,您可以非常灵活地访问数据,并且具备强大的正确性约束条件,使得编码数据变得更加容易。然而,RDBMS并不会为任何特定问题提供良好的优化方案,它只是让您轻松地更改问题。
如果您开始快速增长并意识到需要扩展到超出单个数据库服务器的规模,那么您就需要做出更艰难的选择。您需要开始识别瓶颈并消除它们。 RDBMS将成为一个非常复杂的相互依存的代码集合,您需要逐步分解它。数据之间的相互连接越多,您所需进行的工作就越多,但也许您不必完全解开这一切。如果您主要进行阅读操作,也许可以通过简单的复制来应对。如果您的市场饱和并且增长正在趋于平稳,也许可以部分去规范化并分片到固定数量的数据库服务器。也许您只有一些问题表需要移动到更可扩展的数据存储中。如果您的使用情况非常适合缓存,则可以将负载迁移到巨大的 memcached 集群中。
可扩展的键值存储(如 BigTable)的用处在于当上述解决方案均无法解决问题时,您拥有大量单一类型的数据,即使去规范化,单个表也太大了无法放在一个服务器上。此时,您需要能够任意分区,并仍然具有干净的API来访问它。当数据分布在如此多的机器上时,您无法要求这些机器之间进行大量通信,这是许多标准关系型算法所必需的。正如您所建议的那样,这些分布式查询算法可能需要比适当索引的关系数据库中的等效连接更多的处理能力,但由于它们是并行的,因此实时性能比任何单个机器都快数个数量级(假设存在可以容纳整个索引的机器)。
现在,一旦您可以通过只需插入更多服务器来横向扩展您的大规模数据集,可扩展性的难题就解决了。好吧,我不应该说解决了,因为这个规模的持续运营和开发比单服务器应用程序要困难得多,但是关键是应用服务器通常可以通过"share-nothing"架构轻松扩展,只要它们能够及时获取所需的数据。
回答您有关常用ORM如何处理无法使用JOINs的问题,简短的答案是他们不会。 ORM代表对象关系映射,大部分工作都是将强大的谓词逻辑关系范式转换为简单的面向对象数据结构。它们提供的大部分价值都无法从键值存储中实现。实际上,在这种情况下,您可能需要构建并维护自己的数据访问层,以适应您特定的需求,因为这些规模的数据配置文件将会有很大的变化,并且我认为存在太多的权衡,以至于通用工具无法出现并像RDBMS一样占主导地位。总之,在这个规模下,你总是需要做更多的工作。
话虽如此,肯定会有越来越多的基于键值存储原语构建关系型或其他聚合功能的可能性。我在这方面没有足够的经验进行具体评论,但企业计算领域有很多研究知识(例如Oracle),学术界还有大量未开发的理论知识,Google、亚马逊、Facebook等公司有大量实践经验,但过滤到更广泛开发社区中的知识仍然相对有限。
但是,现在许多应用程序正在转向Web,并且越来越多的全球人口正在上网,不可避免地越来越多的应用程序需要扩展,并且最佳实践将开始形成。云服务(如AppEngine和EC2)以及Cassandra等开源数据库将缩小双方的知识差距。在某种程度上,这与并行和异步计算一起处于起步阶段。肯定是作为程序员非常有趣的时期。