我对它们不太熟悉(我只阅读了与其他人相同的博客/新闻/示例),但我的看法是,他们选择以可扩展性的名义牺牲许多正常的关系数据库功能 -我会试着解释一下。
假设您的数据表中有 200 行。
在 google 的数据中心中,其中 50 行存储在服务器 A 上,50 行存储在 B 上,100 行存储在服务器 C 上。此外,服务器 D 包含来自服务器 A 和 B 的数据的冗余副本,服务器 E 包含服务器 C 上的数据的冗余副本。
(在现实生活中,我不知道将使用多少台服务器,但它设置为处理数百万行,所以我想象不少)。
要“选择 * where name = 'orion'”,基础设施可以将该查询发送到所有服务器,并汇总返回的结果。这使他们可以在任意数量的服务器上进行线性扩展(仅供参考,这几乎就是 mapreduce)
然而,这意味着您需要一些权衡。
如果您需要对一些数据进行关系连接,这些数据分布在 5 台服务器上,那么这些服务器中的每台都需要从彼此的每一行中提取数据。当您有 200 万行分布在 10 台服务器上时,请尝试这样做。
这导致权衡#1 - 没有连接。
此外,根据网络延迟、服务器负载等,您的一些数据可能会立即保存,但有些可能需要一两秒钟。同样,当您有数十台服务器时,这会变得越来越长,而通常的方法是“每个人都等到最慢的人完成”不再是可以接受的。
这导致了权衡 #2 - 您的数据在写入后可能并不总是立即可见。
我不确定还有什么其他的权衡,但在我的脑海中,这些是主要的 2。