首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数据结构的算法和使用数据库的算法有什么不同?

使用数据结构的算法和使用数据库的算法有什么不同?
EN

Software Engineering用户
提问于 2013-01-03 23:31:28
回答 4查看 6.4K关注 0票数 11

--一般问题

使用数据结构的算法和使用数据库的算法有什么不同?

一些上下文

这是一个困扰我一段时间的问题,我一直未能给出一个令人信服的答案。

目前,我正致力于加强对算法的理解,当然,算法涉及到大量的数据结构。这些是基本结构,如包、队列、堆栈、优先级队列和堆。

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

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

在我看来,在发送之前,我会尝试在数据库端进行同样多的操作,因为通信成本很高。这也让我想知道,当您使用严格定义在您自己的逻辑中的算法和数据结构,而不是处理数据库的数据?

以下是问题..。

问题

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

  4. @Harvey :使用数据结构处理数据比在数据库中处理数据要快吗?

Clarifications

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

我知道没有具体背景的答案是困难的。食物换思想,建议,或讨论要点,主要是我正在寻找的,将是最感谢的!

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2013-01-03 23:46:32

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

  1. 记忆常驻,
  2. 短暂的,
  3. 规模有限,
  4. 如果不添加诸如锁或不可变的并发机制,
  5. 不符合
  6. 如果仔细挑选的话,要快。

数据库大部分是:

  1. 盘装,
  2. 坚持不懈,
  3. 很大,
  4. 安全的同时,
  5. 与酸兼容,具有事务性功能,
  6. 比数据结构慢

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

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

票数 19
EN

Software Engineering用户

发布于 2013-01-04 03:58:04

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

在抽象层次上,没有--数据库是一个数据结构。

在特定级别上,数据库通常具有持久化数据的目的,通常以一种针对插入、更新、检索、连接或其他目的(或组合)的格式进行优化。

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

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

在倾向上,我会争辩

( a)如果需要以超出运行时或特定算法的目的可访问的方式持久化数据,则使用数据库。

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

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

但是,请注意,出于性能原因,内存中的数据库不一定会持久化数据。例如Redis哈娜

什么时候数据库中的方法比您自己的逻辑中的方法效率更低呢?

答案在很大程度上取决于所使用的环境和数据库的类型。我会把这个问题改写为“是什么使方法更有效?”然后,它将成为一种评估方法(=算法)的练习,您将为您自己的数据结构使用数据库所使用的方法。也请看下一点。

使用数据结构处理数据比在数据库中处理数据要快吗?

同样,这取决于具体情况。通常,内存中数据的处理(运行算法的进程可以直接访问)比将请求发送到另一个进程(在同一台计算机或跨网络)并要求它返回结果更快。但是,如果数据已经驻留在数据库中,那么向它发送一个命令--比如一个SQL语句来连接两个表并计算一些聚合函数--并且只检索一个小的数据摘要或子集,可能比首先在本地传输所有数据和计算结果(使用您自己的数据结构)要有效得多。

票数 6
EN

Software Engineering用户

发布于 2013-01-04 14:04:49

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

如果您可以在请求之间的内存中保留大部分enire数据结构,那么这通常将是您最快的赌注。如果不能,那么就很难超过一个良好的数据库结构,使用规范化的表和适当的索引来搜索和更新除了小记录集以外的其他任何东西的性能,特别是在一个记录数以百万计的系统中。

关系数据库通常在幕后使用B+树或其变体,并为频繁访问的记录进行许多优化,如磁盘和缓冲池上的数据对齐。这使得它们擅长快速处理大型数据集,特别是在涉及聚合或过滤的情况下。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/181431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档