许多“BAW”(大屁股网站)正在使用依赖于带有索引的巨大表的数据存储和检索技术,并使用不会/不能在查询中使用 JOIN 的查询(BigTable、HQL 等)处理可扩展性和分片数据库。当你有大量的数据时,它是如何工作的 非常 有关的?

我只能推测大部分连接必须在应用程序方面完成,但这不会变得昂贵吗?如果您必须对几个不同的表进行多次查询才能获取要编译的信息怎么办?多次访问数据库是否会比一开始就使用连接变得更加昂贵?我想这取决于你有多少数据?

对于常用的 ORM,它们如何处理无法使用连接的问题?如今大量使用的 ORM 是否支持此功能?或者大多数必须接近这种级别的数据的项目是否倾向于自行推出?

因此,这不适用于我当前正在做的任何项目,但它已经在我的脑海中萦绕了几个月,现在我只能推测什么是“最佳实践”。我从来不需要在我的任何项目中解决这个问题,因为它们从未达到所需的规模。希望这个问题也能帮助其他人。

正如下面有人所说,没有连接,ORM“不起作用”。是否还有其他数据访问层可供处理此级别数据的开发人员使用?

编辑:为了澄清一些, 文科·弗萨洛维奇 说:

“我相信士力架是想说话 关于 NO-SQL,其中事务数据 在 Hadoop 中非规范化并使用,或者 BigTable 或 Cassandra 方案。

这确实是我所说的。

那些抓住 xkcd 参考的人可以获得奖励积分。

有帮助吗?

解决方案

我看它的方式,关系数据库是一种通用工具来对冲你的赌注。由于现代计算机的速度不够快,而RDBMS”被精心优化的不够,你可以长到相当一个体面的大小在一个机箱中。通过选择一个RDBMS你是给自己的数据非常灵活的接入,并具有强大的正确性的约束,使人们更容易对数据代码的能力。然而,RDBMS是不会代表一个很好的优化对于任何特定的问题,它只是给你的灵活性,容易改变的问题。

如果你开始快速增长,实现你将不得不超越单个数据库服务器的大小,你突然有更难的选择,使。您将需要开始确定瓶颈和删除它们。该RDBMS将是相互依赖的一个讨厌的咆哮结,你必须要梳理出。更多相互连接你的数据,你就必须做更多的工作,但也许你不会有完全理清整个事情。 如果你正在读重,也许你可以用简单的复制获得通过。如果你的饱和市场增长趋于平缓,也许可以部分非规范化和碎片固定数量的数据库服务器。也许你只是有一个可以移动到一个更具扩展性的数据存储问题表了一把。也许你的使用配置文件是非常友好的缓存,您可以负载只是迁移到一个巨大的memcached集群。

在哪里可扩展的键值存储样的BigTable进来时没有以上可以工作,你有,即使它的非规范化的一个表中的单个类型的这么多的数据是太多一台服务器。在这一点上,你需要能够随意对它进行分区,仍然有一个干净的API来访问它。当然,当数据在这么多的机器摊开你不能要求这些机器来相互交谈不多,其中很多标准的关系算法需要算法。正如你提到的,这些分布式查询算法,有需要比同等加入一个适当的索引关系数据库更多的总处理能力的潜力,但因为它们是并行的实时性能幅度优于任何单一的机器可以做的命令(假设可能保持整个索引甚至存在的机器)。

现在,一旦你可以扩展您的海量数据水平放置(由刚刚在更多的服务器堵塞),可扩展性的最困难的部分已经完成。嗯,我不应该说的完成的,因为持续经营和发展在这一规模比单服务器应用了很多困难,但关键是应用服务器通常是微不足道的通过无共享规模建筑只要他们能得到他们及时需要的数据。

要回答有关常用的ORM如何处理无法使用的问题连接,简单的答案是他们不这样做。 ORM代表对象关系映射,并且最一个ORM的作业只是平移谓词逻辑简单的面向对象的数据结构的功能强大的关系范例。大多数的他们给你是根本不会有可能从一个key-value存储的值。在实践中,你可能会需要建立和维护找到适合自己的特殊需要您自己的数据访问层,因为在这些范围内的数据曲线要显着变化,我相信有太多的折衷的通用工具出现并成为主导的RDBMS已经在路上。总之,你总能在这个规模做多跑腿。

这就是说,它肯定会是有趣的,看看有什么样的关系或其他聚合功能可以在key-value存储基元的顶部之上。我真的没有在这里足够的经验专门发表评论,但在企业℃的很多知识omputing这个可以追溯到多年(如Oracle)的,很多在学术界尚未开发的理论知识,很多在谷歌,亚马逊,Facebook和等实用知识,但是这并过滤掉到更广泛的开发社区的知识仍然相当有限。

然而,现在很多应用都转移到网络,越来越多的世界人口处于联机状态,不可避免地越来越多的应用将有规模和最佳实践,将开始结晶。知识差距会从两侧的云服务,如应用服务引擎和EC2,以及像Cassandra的开源数据库被消减下来。在某种意义上,这种齐头并进的平行和异步计算,这也是处于起步阶段。绝对一个引人入胜的时间是一个程序员。

其他提示

您是从一个错误的假设开始。

数据仓库不归数据,一个事务应用归一化的方式相同。有没有“大量”的加入。有相对较少。

在特定的第二和第三范式违规不是“问题”时,由于数据仓库很少更新。而当它们被更新,它通常只是一个状态标志的变化,使维度行作为“当前”与“不是当前的”。

由于您不必担心更新,你不分解下来到2NF水平,更新不会导致异常的关系。没有更新意味着没有异常;并没有分解,没有加入。您可以预先加入了一切。

通常,DW数据根据星型架构分解。这将引导您将数据分解成包含措施的数字“事实”表 - 与单位数字 - 和外键引用维度

一个维度(或“业务实体”)是作为现实世界的东西带属性的最好的思想。通常情况下,这包括诸如地理,时间,产品,客户等,这些东西往往具有复杂的层次结构。层次结构通常是任意的,由各种业务报告需求所定义,而不是建模为独立的表,而只是列在用于聚合的维度。


要解决大家的一些问题。

“该接合,必须对事物的应用侧进行”。的种类。的数据是“预连接”被加载之前。尺寸数据往往加入有关维相关的源数据。它的加入和加载为相对扁平的结构。

它不被更新。取而代之的更新,更多的历史记录被插入。

“但不会是开始变得昂贵?”。的种类。这需要一定的照顾来获得加载的数据。但是,有没有很多报告/分析联接。的数据被预连接。

在ORM问题基本上没有实际意义,因为数据被预连接。你的ORM映射到的事实或尺寸合适。除特殊情况外,尺寸往往是小十岁上下完全装入内存。唯一的例外是当你在金融(银行或保险)或公共设施,并拥有庞大的客户数据库。这些客户维度很少适合在存储器中。

A JOIN 是一个纯粹的关系术语,并非所有数据库都是关系数据库。

其他数据库模型有其他建立关系的方法。

网络数据库使用无尽的链条 find a key - fetch the reference - find a key 应该使用通用的编程语言进行编程。

代码可以在应用程序端运行,也可以在服务器端运行,但它不是 SQL 甚至不是基于集合的。

如果设计得当,网络数据库可以比关系数据库快得多。

例如,网络数据库可以将对另一个实体的引用存储为指向文件中的偏移量的直接指针,甚至是磁盘上存储有关该实体的信息的块的直接指针。

如果您编写了有效的代码来做到这一点,这将使遍历网络变得异常快。

关系数据库只能将引用存储为基本值对,例如整数(或更高阶的三元组或元组)。

要在关系数据库中查找这些值,引擎应该执行以下操作:

  • 找出包含第一个值的元组所在的位置
  • 找到第二个值
  • 查找a中的根地址 B-Tree 保存第二个数字所指的数据
  • 遍历这棵树
  • 找到指向实际表的指针(它可能存储为 B-Tree 本身,在这种情况下,指针是 PRIMARY KEY 我们要追寻的行)
  • 通过指针查找表的行或遍历表
  • 最后,得到结果。

你只能在一定程度上控制它。之后,您只需发出 SQL 查询并等待。

关系模型是为了简化开发人员的生活,而不是为了始终实现超高速。

这与汇编与汇编相同。高级语言,关系模型是一种高级语言。

您可能想阅读我博客中的文章

, ,其中我尝试解释几种常用数据库模型之间的差异。

当你denormalise以这种方式你的数据,你这样做避免参加不同项目的成本;你接受某些数据可能被复制,并结合它的某些方面可能很困难,使用简单查询的性能优势。

如果您在做在应用层连接的任何量很大,它意味着你有没有去归一化还不够。

在理想情况下,你就可以做一个查询你想要的任何数据集。在实践中,你不应该使用超过两个或三个查询您的应用程序的任何方面,任何应用程序级的加盟将更加的东西,一个简单的检索从插入单独的结果集到视图中。

只有真正需要这种东西的真正大规模的数据集,并有参与各种权衡。仅举一个例子:BigTable的不能做聚合查询,比如给你一个数。它可以用来给你一个数字,是大致准确的 - 在这个意义上,如果你有,比如说,12149173条记录,其中在最后一小时加23721,它并没有真正关注的是最好的,你可以发现的是,你有“约1210万条记录”。如果您的应用程序依赖于知道确切的数字,在任何特定的时刻,那么你不应该使用BigTable的吧,是一般的态度。

像Facebook应用程序只有很少的数据变化,大部分时间用户发布的新项目。因此,事实上,当一个项目更改多重记录需要更新是一个较小的问题。

  

这允许使数据不被   标准化没有击中常见   问题的更新。

像亚马逊的应用程序都不能为单个用户加载所有的数据到内存(有多大是一个购物车毕竟?),然后在RAM更新数据并写入作为一个单一的数据项。

  

再次除去需要有   大多数数据归一化。

您的交易比例为便于应用开发的,所以如果你不需要扩展到很高的高度,你不妨保持轻松应用开发RDBMS提供的。

我认为,在这种情况下你要在你自己几乎和将不得不自己滚一切。我没有去过那里,但都认为这是对我们的一些项目。你可以用关系型数据块相当大的(如SO证明),所以我将继续享受关系老天爷了。

通常,数据仓库是围绕使用内置连接和数据分割成尺寸和事实表(与所谓的“星型架构”等)的

加入将经常被预先计算并作为去正规化的表存储。

我不知道有任何ORM工具与数据库系统工作不容许加入,因为这些一般不被视为传统的关系型数据库。

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