大型数据库(如BigTable、SimpleDB)的优点

16
新的数据存储范例,例如Google BigTable和Amazon SimpleDB,专门为可扩展性而设计。基本上,禁止连接和去规范化是实现这一目标的方式。
然而,在这个话题中,共识似乎是在大型表上进行连接不一定会太昂贵,而且在某种程度上"过分强调"了去规范化。
那么,为什么这些系统不允许连接并强制将所有内容合并到单个表中以实现可扩展性呢?是因为需要存储在这些系统中的数据量很大(许多TB)吗?
对于这些规模,一般的数据库规则是否不适用于这些系统? 还是因为这些数据库类型专门针对存储许多相似对象而设计?
或者我错过了一些更重要的东西?
5个回答

16
分布式数据库并不像Orion所说的那么简单,对于在分布式数据集上优化完全关系查询已经进行了相当多的工作。您可以查看类似Teradata、Netezza、Greenplum、Vertica、AsterData等公司正在进行的工作。(Oracle最近也加入了这个游戏,微软则以曾经叫做DataAllegro的公司的名义购买了他们的解决方案)。
话虽如此,当数据规模扩大到TB级别时,这些问题变得非常复杂。如果您不需要严格的事务性和一致性保证,您可以很容易地去规范化和不进行连接。特别是如果您不需要进行交叉引用,尤其是如果您不需要进行adhoc分析,但需要带有任意转换的程序访问。
规范化被高估了。仅仅因为当你处理100TB时会发生这种情况,并不意味着每个开发人员都应该使用这个事实。这些开发人员从未学习过数据库,并由于贫瘠的模式规划和查询优化而难以查询百万或两百万行。
但是,如果您处于100TB级别,请尽管使用...
哦,这些技术之所以引起轰动,还有一个原因——人们发现有些东西根本就不应该首先放入数据库,并且意识到他们不是在处理他们特定领域的关系,而是在处理基本键值对。对于不应该放入DB中的东西,Map-Reduce框架或某些持久性、最终一致性存储系统可能正是所需要的。
在更小范围内,我强烈推荐BerkeleyDB来解决这些问题。

14

我对它们不是太熟悉(我只是读了和其他人一样的博客/新闻/示例),但我的看法是,他们选择了以可扩展性为名牺牲了许多正常的关系型数据库功能 - 我会尝试解释。

想象一下你的数据表中有200行。

在Google的数据中心,其中50行存储在A服务器上,50行存储在B服务器上,另外100行存储在C服务器上。此外,D服务器包含来自A和B服务器的冗余数据副本,而E服务器包含C服务器上的数据的冗余副本。

(在现实生活中,我不知道会使用多少台服务器,但它被设置来处理数百万行,所以我想应该会有相当多)。

要“选择 “* where name ='orion'”,基础架构可以将该查询发送到所有服务器,并聚合返回的结果。这使得它们几乎可以在任意数量的服务器上线性扩展(FYI,这几乎就是mapreduce的工作原理)。

然而,这意味着您需要做出一些折衷。

如果您需要在某些数据上进行关系连接,其中数据分散在5个服务器上,那么每个服务器都需要为每行数据从彼此拉取数据。当您在10台服务器上分散了200万行时,请尝试这样做。

这导致了折衷方案#1-没有连接。

此外,根据网络延迟,服务器负载等因素,您的一些数据可能会立即保存,但有些可能需要等待一两秒钟。同样,当您有数十个服务器时,这变得越来越长,而“每个人只需等到最慢的那个完成”正常方法也不再可行。

这导致了折衷方案#2-写入后您的数据可能并非立即可见。

我不确定还有什么其他折衷方案,但这是我能想到的主要两个。


4

我理解的是,“去规范化,不使用连接”的整个理念存在,并非因为连接本身在大型系统中无法扩展,而是因为在分布式数据库中实现连接几乎是不可能的。

当您存储单一类型的基本不变数据时(就像Google所做的那样),这似乎是相当合理的。我理解得对吗?


2
你基本上完美地掌握了它。 另外加上,“在不同的“表”中交叉引用数据的需求相当小”。 - SquareCog

2

如果你谈论的是几乎只读的数据,规则就会改变。在数据经常变化的情况下,去规范化是最困难的,因为需要增加工作量,并且锁定问题更多。如果数据几乎不发生变化,则去规范化就不是那么大的问题。


如果更新或删除时数据级联是不可取的,或者更改失败并不是一种负面影响;反规范化似乎也是有道理的,或者至少不是一个糟糕的选择。例如,如果发票行项目只是指向具有固定价格的库存的引用,那么它们将非常无用,因为当库存更新价格时,发票会错误地报告金额。这个例子很复杂,可以通过不反规范化来解决,但是大多数解决方法会增加活动集大小或使数据脱离一致的关系型数据库管理系统。 - MrMesees

-1

现今,您需要找到更多用于数据库的互操作环境。通常,您不仅需要关系型数据库,如MySQL或MS SQL,还需要像Hadoop这样的大数据平台或非关系型数据库,如MongoDB。在某些情况下,所有这些数据库将在一个解决方案中使用,因此它们的性能在宏观尺度上必须尽可能相等。这意味着您将不能只使用Azure SQL作为关系型数据库,再使用一个具有2个内核和3GB RAM的VM来运行MongoDB。您必须扩展您的解决方案并尽可能使用数据库作为服务(如果不可能,则在云中构建自己的群集)。


这篇文章读起来像是一堆流行语和糟糕的语法拼凑而成。很抱歉地说,它不容易阅读。请考虑重新组织内容以便更容易阅读。 - MrMesees

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接