如果应用程序仅在本地执行操作,使用数据库服务器是否有意义?


41

我已经看到一些应用程序,它们基本上是在系统本地运行的应用程序软件(因此它们在网络上没有太多通信)。这些应用程序似乎依赖于数据库服务器来存储其数据。

应用程序的一个示例是Amarok(Linux上的流行音乐播放器)。我不知道他们是否仍会这样做,但我记得曾经有一段时间安装Amarok意味着您必须安装MySQL服务器并使其始终在后台运行。

与使用较小的嵌入式SQL解决方案(例如sqlite)相比,将服务器用于本地存储有什么优势?我说的是一般的应用程序软件,不一定是amarok(这只是一个例子)。与嵌入式数据库相比,在任何情况下使用数据库服务器都有意义吗?


4
拥有数据库可能非常重要。具有进程内数据库或单独的进程数据库是实现选择/细节。
9000

2
我明白那个。问题更多是关于为什么要为本地应用程序在进程内数据库(如SQLite)上选择单独的进程数据库(如mysql服务器)。
9a3eedi

Answers:


29

SQLite提供了何时使用与不使用替代品的相当不错的清单:

https://www.sqlite.org/whentouse.html

根据我的经验,此摘要行很好地捕获了SQLite用例:

SQLite不与客户端/服务器数据库竞争。SQLite与fopen()竞争。

关于这一点,本文进行了详尽的扩展。它还有一个标题为“客户端/服务器RDBMS可以更好地工作的位置”的部分。简而言之,它们是:

  • 客户端/服务器应用程序:网络上的多个用户。
  • 高容量网站:写作强度高或阅读强度高,需要分片。
  • 非常大的数据集:大于可以合理地存储在一个磁盘上的数据集
  • 高并发:尤其是并发写入。

@ 9a3eedi:实际上,在这四个要点中,没有一个描述了将完整的数据库服务器与本地存储结合使用的情况(尤其是前两个是完全相反的情况)-因此,请您启迪一下为什么选择这个功能答案,尽管它不适合您的原始问题?顺便说一句,正是由于这个原因,我给了这个答案一个低俗的评价。
布朗

@DocBrown:应该使用客户端/服务器RDBMS的特定情况是[请参见答案];SQLite可以正常工作。我不确定那里还有什么不清楚的地方,因此,如果您认为有必要,可以随时编辑答案。
Denis de Bernardy

最初的问题是关于特定情况,即如果应用程序仅在本地(从标题中引用)或使用服务器进行本地存储(从问题文本中引用)进行操作, ac / s数据库才有意义。上面的四个场景或者与之(前两个)完全相反,或者与“本地”场景(后两个)非常不一样或不常见。因此,您所写的内容没有错,但并不适合这个问题。
布朗

@DocBrown-简短的答案是:除非您要处理超大数据集或需要并发写入,否则它没有任何意义。(或者,出于明显的原因,需要SQLite不提供的东西。)同样,如果您不清楚答案,请随时编辑答案。
Denis de Bernardy

好吧,如果您真的认为该列表是完整的(并给出一个隐藏的声明,对于本地方案,使用C / S DB服务器没有任何意义),那么我不同意,并且我认为我无法改进通过添加一些说明来回答您的问题。
Doc Brown

28

即使对于具有单个用户的单个系统,“真实的”数据库服务器也是有意义的:

  1. 它使用一种熟悉的语言(SQL)。SQLite确实使用SQL,但是某些嵌入式数据库(例如,对象数据库NoSQL)不使用SQL。由于它们不那么普遍,因此它们往往具有较高的学习曲线。
  2. 它提供了诸如SQLite之类的产品可能不提供或至少不完全提供的参照完整性,约束,触发器等。
  3. 通过针对真正的多用户,符合ACID的网络数据库,该应用程序可以选择在单用户/单工作站方案中工作,或作为使用同一代码库的多用户托管应用程序工作。
  4. 用户具有使用标准工具(例如SQL Developer,MySQL Workbench,SQL Server Management Studio)脱机检查数据,使用这些工具加载或备份数据等的能力。尽管有可能使用多种嵌入式数据库类型,人们可能更熟悉C / S数据库世界中的那些工具。

主要缺点是需要安装和维护数据库服务器软件,这对于非技术用户(甚至许多技术用户)来说有点复杂。诸如Linux之类的操作系统使此操作变得更容易:我在Linux系统上运行PostgreSQL和MySQL。我安装的应用程序几乎完全没有交互作用,因此与它们挂钩。


9
其实,有一个数据库系统(即Sybase SQL Anywhere的)具有完全的SQL支持,参照完整性,ACID,存储过程,这并不能在本地配置(运行时,虽然它可以要求服务器设置或安装为服务设置用于多用户环境)。我不知道这些属性的任何其它的数据库系统,如果有人知道一个,我会很感兴趣的。
布朗博士

3
@DocBrown IIRC MS SQLServer Compact 以dll的形式提供给您,尽管LocalDB可能是更好的选择-尽管需要管理员权限,但它不需要作为服务安装。
gbjbaanb 2015年

5
为了增加对缺陷有效性的讨论,除了在回答中已经好奇地提到SQLite之外,许多非SQL数据库和类似数据库的系统(例如OrientDB,Solr等)都具有专用的嵌入支持
mikołak

14
SQLite确实提供了引用完整性(尽管需要将其打开)和基本约束。如果使用得当,它也比大多数服务器快得多。与服务器相比,它的主要缺点是它是单写程序。
Jan Hudec

2
@DocBrown:Firebird的嵌入式数据库提供了完整的SQL支持,包括引用完整性,ACID保证,存储的proc和触发器。它过去不支持与嵌入式数据库的多个并发连接,并且我不确定该限制是否仍然存在,但是整个SQL功能集是否存在。
梅森惠勒2015年

21

我认为这与惯性有关。

Amarok基于1997年的XMMS。要拥有良好的数据库功能,您必须使用服务器,因为它比基于文件的解决方案要强大得多,后者决不具有良好的数据库功能。

良好的本地嵌入式数据库(如SQLlite)即将到来并越来越流行,这是相当近期的事情。


据我所知,AmaroK 1(可能基于XMMS)不依赖于数据库服务器。是与KDE4一起发布的Amarok 2引入了依赖关系,当时我很奇怪,他们要求我安装MySQL并使其在后台运行
9a3eedi 2015年

10

最重要的区分功能是并发

如果只有一个应用程序在一个实例中为用户运行,则嵌入式解决方案(无论是sqlite还是某些对象存储)通常都可以。

但是,如果您有多个实例需要同时操作数据库,则需要有一个服务器来同步它。SQLite一次只能在整个数据库中进行一次写入,大多数其他嵌入式解决方案也是如此。而且,即使您有多个应用程序,也可能需要更详细的约束规范,而嵌入式解决方案通常都不允许这样做。


5

许多其他答案都将并发性作为优势,但是由于db是作为服务器运行的,因此数据库可以运行任务,而无需运行应用程序。这可能是维护,备份,与其他服务器的同步或任何计划任务。

如果您认为您的应用程序可能会变成客户端/服务器应用程序,则可能要从头开始使用RDBMS,而不是将其移植到以后。

我不知道给定的示例是否利用了这一点。


2

除非您正在运行内存和CPU较低的嵌入式系统,否则我认为在后台运行服务器不会对您造成任何伤害。

在本地运行数据库服务器很好。该数据库旨在访问和操纵数据。网络访问是一个加号,可能需要或可能不需要。有一些工程和科学工具可以做到这一点。

假设您正在本地应用程序上使用数据。为什么不使用数据库?相对于什么?


如果我要将应用程序部署给普通用户(例如像AmaroK这样的音乐播放器),我认为让他们安装MySQL服务器并使其在后台运行对系统来说有点过多,这将是用户所需要的。不喜欢。但是我想这取决于应用程序。这与使用类似SQLite的方法相反。
9a3eedi

2

这取决于您的数据抽象和整个应用程序空间,访问管理要求,您计划在数据维护上的投资,所需原型的紧迫性,您处于学习曲线中的位置等。

如果您想确保数据库与应用程序紧密集成,而无需其他应用程序的访问,则可以创建嵌入式数据库孤岛。可以举例说明使用SQLite的Mozilla Firefox Web Storage实现。

如果您需要有限的数据来提高效率,则最好选择内存数据库的设计。

另一方面,如果您有许多应用程序对同一数据运行多个查询,并且需要更好的数据存储结构以优化性能,则需要集中式DBMS。当科学研究需要大量数据并且查询响应时间将对整体用户体验产生巨大影响时,我绝对会选择将其用于科学研究。

对于Amarok案例,我认为当时是选择开源DBMS,然后才选择嵌入式数据库的路径。

如果您手头有一个特定的系统定义,则可以更轻松地权衡利弊。

V / r,Umut

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.