Google BigTable和Amazon SimpleDB等新学校数据存储范例专为可扩展性而设计。基本上,禁止连接和非规范化是实现这一目标的方法。

然而,在这个话题中,似乎是大家的共识表格不一定非常昂贵,并且非规范化被“高估”。在某种程度上 那么,为什么这些上述系统不允许连接并将所有内容强制在一个表中以实现可伸缩性?是否需要存储在这些系统中的大量数据(许多兆兆字节)?
数据库的一般规则是否根本不适用于这些尺度? 是因为这些数据库类型专门用于存储许多类似的对象吗? 或者我错过了一些更大的图片?

有帮助吗?

解决方案

分布式数据库并不像Orion暗示的那样天真;在分布式数据集上优化完全关系查询方面已经做了大量工作。您可能想看看像Teradata,Netezza,Greenplum,Vertica,AsterData等公司正在做什么。 (最后甲骨文最近公布了这个游戏;微软以这家曾经被称为DataAllegro的公司的名义购买了他们的解决方案。)

话虽如此,当数据扩展到太字节时,这些问题变得非常重要。如果您不需要严格的事务性和一致性保证可以从RDBM获取,则通常更容易进行非规范化而不进行连接。特别是如果你不需要交叉引用太多。特别是如果您没有进行临时分析,但需要使用任意转换进行编程访问。

非规范化被高估了。仅仅因为当你处理100 Tera时会发生这种情况,并不意味着每个开发人员都应该使用这个事实,他们从不费心去了解数据库,并且由于糟糕的模式规划和查询优化而无法查询一百或两行

但是,如果你处于100 Tera范围内,无论如何......

哦,这些技术引起轰动的另一个原因 - 人们首先发现有些东西从未属于数据库,并且意识到他们并没有处理他们特定领域的关系,而是基本键值对。对于不应该存在于数据库中的东西,完全有可能Map-Reduce框架或一些持久的,最终一致的存储系统就是这样。

在全球范围内,我强烈推荐BerkeleyDB解决这些问题。

其他提示

我对它们不太熟悉(我只阅读与其他人相同的博客/新闻/示例)但我对此的看法是,他们选择牺牲了名称中的许多常规关系数据库功能可伸缩性 - 我会尝试解释。

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

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

(在现实生活中我不知道会使用多少台服务器,但它的设置是为了处理数百万行,所以我想的很多。)

要“select * where name ='orion'”,基础结构可以将该查询发送到所有服务器,并聚合返回的结果。这使得他们可以在他们喜欢的服务器上进行几乎线性扩展(仅供参考,这几乎就是mapreduce)

但这意味着你需要一些权衡。

如果您需要对某些数据进行关系连接,而这些数据分布在5个服务器上,则每个服务器都需要从每个每个中提取数据。当您在10台服务器上分布有200万行时,请尝试这样做。

这导致权衡#1 - 没有加入。

此外,根据网络延迟,服务器负载等情况,您的某些数据可能会立即保存,但有些可能需要一秒钟或2次。再次,当您拥有数十台服务器时,这会越来越长,而且“每个人等到最慢的人完成”的正常方法不再可以接受。

这导致权衡#2 - 您的数据在写完后可能并不总是立即可见。

我不确定那里有什么其他的权衡,但最重要的是那些是主要的2。

所以我得到的是整个“非规范化,没有连接”。哲学存在,不是因为联合本身不能在大型系统中扩展,而是因为它们实际上不可能在分布式数据库中实现。

当您存储单个类型的大部分不变数据时,这似乎非常合理(就像Google一样)。我在这里走在正确的轨道上吗?

如果您谈论的是几乎只读的数据,则规则会发生变化。在数据发生变化的情况下,非规范化最难,因为所需的工作量增加,锁定问题也更多。如果数据几乎没有变化那么非规范化就不是问题了。

Novaday您需要为数据库找到更多的互操作环境。更频繁您不仅需要关系数据库(如MySQL或MS SQL),还需要大数据服务器场(如Hadoop)或非关系型数据库(如MongoDB)。在某些情况下,所有这些DB都将在一个解决方案中使用,因此它们的性能必须在宏观规模上尽可能相同。这意味着,您将无法使用Azure SQL作为关系数据库和一个具有2个内核和3GB内存的VM用于MongoDB。您必须扩展您的解决方案并在可能的情况下使用数据库即服务(如果不可能,则在云中构建您自己的集群)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top