使用数据结构的算法与使用数据库的算法之间有什么区别?


10

一般问题

使用数据结构的算法与使用数据库的算法之间有什么区别?

一些背景

这个问题困扰了我一段时间,而我却无法给出令人信服的答案。

目前,我正在努力加深对当然会大量涉及数据结构的算法的理解。这些是基本结构,例如袋,队列,堆栈,优先级队列和堆。

我还每天使用数据库来存储最终用户已处理和提交或程序处理过的数据。我通过DAL检索和提交数据,该DAL具有自己的数据结构,该结构是根据数据库中的表生成的。

当我可以选择使用数据库对数据进行排序以按升序/降序将其发送回给我或检索并将数据加载到我的逻辑中,在优先级队列中处理此数据并进行堆排序时,我的问题就来了所有的。或者另一种方法是使用数据库搜索记录,而不是加载记录的子集并使用诸如二进制搜索之类的方法来查找我感兴趣的一个或多个记录。

在我看来,由于通信成本很高,因此在发送数据库端之前,我将尝试在数据库端进行尽可能多的操作。这也使我想知道您何时使用严格在自己的逻辑内定义的算法和数据结构,而不是处理数据库而不是数据库的数据?

所以这是问题...

问题

  1. 数据结构和数据库之间有什么区别?
  2. 我们什么时候使用的算法仅使用您自己的逻辑而不是数据库逻辑定义的数据结构?
  3. @Harvey发表:什么时候数据库中的方法变得比您自己的逻辑中的方法效率低?
    • @mirculixx帖子:什么使方法有效?
  4. @Harvey帖子:处理具有数据结构的数据比在数据库中处理数据更快?

澄清说明

  1. @Grant帖子:我通常使用的数据库是关系数据库,这些问题来自于它们的使用。但是,我确实认为这些问题适用于任何持久性框架(当我说框架时,我的意思是最一般的意义)。

我知道没有特定上下文的答案很难。我正在寻找有想法的食物,建议或讨论要点,将不胜感激!


datomic.com数据库比传统的关系型的人更贴近用户。您仅查看传统数据库吗?
2013年

@Job不,关系数据库不是我在这里考虑的唯一内容。更多的是了解逻辑数据结构与数据库/持久性单元中数据结构之间的区别。
hulkmeister

通常,我会说-如果可以的话,请使用数据库,但是如果数据库变得太慢,则请使用数据结构。数据复制(例如缓存)不好,因为您必须使两者保持同步,因此除非不能避免,否则请避免。
工作

仅将数据发送到数据库进行排序吗?想要开车绕街改变主意吗?

Answers:


18

数据结构在大多数情况下是:

  1. 内存常驻,
  2. 短暂的,
  3. 大小有限,
  4. 如果不添加诸如锁或不变性之类的并发机制,则不能重新进入,
  5. 不符合ACID
  6. 快速,如果精心选择。

在大多数情况下,数据库是:

  1. 磁盘绑定
  2. 坚持不懈
  3. 大,
  4. 安全并发
  5. 符合ACID,具有交易功能,
  6. 比数据结构慢

数据结构应从一个地方传递到另一个地方,并在程序内部使用。您上次使用数据库将数据从网页发送到Web服务器的时间是什么时候?或者什么时候才对完全驻留在内存中的数据库进行计算?

数据库系统使用数据结构作为其内部实现的一部分。这是一个大小和范围的问题;您可以在程序中使用数据结构,但是数据库系统本身就是一个程序。


关于Web页面到Web服务器的评论,我同意您不在那里使用数据库,但是我确实看到存在一个servlet来处理或转换该数据以持久化到数据库的可能性。在中间层和数据层之间,事情变得有些混乱。为了简化问题,数据库中的方法何时变得比逻辑中的方法使用起来没有好处?
hulkmeister

1
好吧,那是DAL的面包和黄油,不是吗?DAL的存在是为了简化对象和数据库记录之间的转换。DAL可以很好地满足您要使用数据库的80%到90%的需求,但是对于其余的10%到20%的用户,您可能希望回到原始SQL或存储过程,因为它效率更高。
罗伯特·哈维

在排序/过滤的示例中,您可能希望在数据库服务器上进行这种处理是正确的。但是您很可能仍会以某种形式的数据结构接收该处理的结果。
罗伯特·哈维

您所提供的观点确实很有帮助。但是,对于直接使用数据库或仅在逻辑上严格使用数据结构的方法(或算法),还是有一些困扰我。我正在查看您列出的两个清单的第6项,想到的问题是,一个比另一个要快吗?我一直认为在源头上处理数据是处理问题的最快方法。您可以在自己的信息中进行更新-我会重新阅读。
hulkmeister

1
由于许多原因,数据库速度较慢。尽管进行了高速缓存,您仍必须使用必须编译的SQL语句从磁盘读取数据,该SQL语句的执行计划经常涉及多个表。这个过程要复杂得多。此外,通常您仍然必须通过网络传输结果,在此将数据转换为数据结构,以便可以使用它。
罗伯特·哈维

6

数据结构和数据库之间有什么区别?

从抽象的角度来看,没有任何东西-数据库一种数据结构。

在特定级别上,数据库通常具有保存数据的目的,通常采用针对插入,更新,检索,连接或某些其他目的(或组合)进行了优化的格式。

例如,如果您比较RDBMS中的一个表以说是一个数据数组,则差异可能在于算法的运行时间,必须编写的代码量,运行算法所需的内存量,或者从程序/算法外部工作/访问数据的灵活性。

我们什么时候使用的算法仅使用您自己的逻辑而不是数据库逻辑定义的数据结构?

我倾向于说

a)如果您需要以超出特定算法的运行时间或用途之外的方式仍可访问的方式持久存储数据,请使用数据库。

b)如果运行时速度很重要或不需要持久性,则使用您自己的(内存中的)数据结构

例如,如果您的算法处理客户记录,则您可能希望存储这些客户记录(例如查找特定区域中的所有客户),以供其他程序/算法稍后使用,以及用于完全不同的目的(例如查找最有价值的客户) )。在那种情况下,使用数据库来持久化数据可能是一个好主意。

但是请注意,出于性能方面的考虑,内存数据库的概念不一定保留数据。例如RedisHANA

什么时候数据库中的方法使用起来比您自己逻辑中的方法效率低?

答案很大程度上取决于环境和所使用的数据库(的类型)。我将问题改写为“哪种方法有效?” 然后,它成为评估与数据库使用的方法相比,您将用于自己的数据结构的方法(算法)的练习。另请参阅下一点。

如何处理具有数据结构的数据比在数据库中处理数据更快?

同样,这取决于具体情况。通常,处理内存中的数据(运行算法的流程可以直接访问)的速度比向另一个流程(在同一台计算机或网络中)发送请求并要求其将结果发送回去要快。但是,如果数据已经存在于数据库中,则向其发送命令(例如,一条SQL语句以连接两个表并计算一些聚合函数),并且仅检索数据的一小部分摘要或子集,可能比首先传输所有数据并在本地计算结果(使用您自己的数据结构)。


1

在此操作中,磁盘访问主要是最昂贵的,通常比网络访问更为昂贵(http://serverfault.com/questions/238417/are-networks-now-faster-than-disks)。除非您的数据库未位于至少1 Gbps网络上并且与Web \应用程序服务器位于同一网络上,否则对于大型数据集,网络性能与磁盘性能无关紧要。或者,如果您的数据恰好位于非常快的固态磁盘上,则其速度将比典型的网络访问快。另外,如果数据库与应用程序服务器位于同一服务器上,则数据库通常提供IPC机制(如命名管道),而不使用TCP / IP。

如果您可以在两次请求之间将大部分\ enire数据结构保留在内存中,那么通常这是您最快的选择。如果不能,那么很难用规范化的表和适当的索引来打乱良好的数据库结构,以搜索和更新除少数记录集以外的任何内容,尤其是在具有数百万条记录的系统中。

关系数据库通常在后台使用B +树或其变体,并具有许多优化功能,例如磁盘和缓冲池上的数据对齐以用于频繁访问的记录。这使得它们擅长快速处理大型数据集,尤其是在涉及聚合或筛选的情况下。


请告诉我我是否正确。只要您考虑使用数据,只要按照您所说的进行操作,就可以将工作集缓存在内存中,那就更快了。否则,尝试使用数据库来传递那些结果,或者找到某种方式来更多地查询数据库?
hulkmeister 2013年

@hulkmeister通常是,除非数据集很小或数据库在慢速网络上距离您的位置较远。
彼得·史密斯

0

数据库是什么意思?您是说像MySQL或SQL Server这样的关系数据库吗?关系数据库是一种元数据结构,它支持由关系模型定义的某些操作子集。关系模型理论主要由60年代的埃德加·科德(Edgar Codd)提出。

关系模型具有通用性和灵活性,但这意味着它无法利用数据的结构或访问模式的任何优势。当您了解有关数据及其访问方式的知识时,数据结构很有用。例如,如果您知道最后放入数据结构中的数据将是您要取出的第一个数据,则可以使用堆栈。

我将关系数据库称为元数据结构,因为它通常是一大堆软件,它使用大量数据结构(例如堆栈,队列,树和列表)来创建关系表的抽象数据结构。


抱歉,只需要澄清关于最后一段的“相当大的一叠”是什么意思?
hulkmeister

@hulkmeister,对不起,应该是“大”而不是“位”。关系模型非常抽象并且相当复杂。提供了一个实现实际执行充分,特别是一个提供ACID((原子性,一致性,隔离性,持久性)负责运行幕后有很多相当复杂的代码。
查尔斯·E·格兰特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.