有充分理由不使用关系数据库?


139

您能否指出替代的数据存储工具,并给出充分的理由使用它们代替过时的关系数据库?我认为,大多数应用程序很少使用SQL的全部功能-看看如何构建不依赖SQL的应用程序会很有趣。

Answers:


148

文件系统中的纯文本文件

  • 创建和编辑非常简单
  • 用户易于使用简单的工具(例如,文本编辑器,grep等)进行操作
  • 有效存储二进制文件

磁盘上的XML或JSON文件

  • 如上所述,但是具有更多的验证结构的能力。

电子表格/ CSV文件

  • 商业用户易于理解的模型

Subversion(或类似的基于磁盘的版本控制系统)

  • 很好地支持数据版本控制

Berkeley DB(基本上是基于磁盘的哈希表)

  • 从概念上讲非常简单(只是未键入的键/值)
  • 蛮快
  • 没有管理开销
  • 支持我相信的交易

亚马逊的简单数据库

  • 我相信很像伯克利分校,但是托管

Google的App Engine数据存储

  • 托管且高度可扩展
  • 每个文档的键值存储(即灵活的数据模型)

CouchDB

  • 文件重点
  • 简单存储半结构化/基于文档的数据

本地语言集合(存储在内存中或在磁盘上序列化)

  • 非常紧密的语言集成

自定义(手写)存储引擎

  • 在某些用例中可能具有很高的性能

我不能声称对它们有任何了解,但是您可能还想研究对象数据库系统


10
如果您还解释了每种选择的弊端,那就太好了,否则应该如何选择呢?谢谢,
Sklivvz

4
同样,将数百万行记录写入数据库可能需要一天的时间,而将一百万行日志附加到文件中则只需几分钟。我永远也不会理解为什么人们坚持将日志数据放入数据库中。
亚伦·迪古拉

33
亚伦:我有一个原因:从日志中选择消息(日期介于2009-01-01和2009-03-01之间),并且type ='error'AND system ='windows':)您如何从文本文件中加载消息?
2009年

1
我强烈建议您尽可能使用文本文件。你不能总是使用它们,但是当你他们是这么容易诊断的问题。
洛伦Pechtel

伯克利分贝肯定有交易。文本文件和xml / json文件没有,因此如果您不小心,多线程应用程序可能会踩死它们。CSV文件非常适合用于参数收集,因为业务用户只需查看它们即可编辑它们,而无需其他工具。文本文件非常适合一次写入/几乎从未读取的应用程序,例如日志记录。要选择一种方法,您需要弄清楚您要实现的目标
O. Jones,

26

马特·谢泼德(Matt Sheppard)的回答很好(修改过),但是在考虑主轴时,我会考虑以下因素:

  1. 结构:它显然会分解成碎片,还是在进行权衡?
  2. 用法:将如何分析/检索/收集数据?
  3. 生命周期:数据有用多长时间?
  4. 大小:有多少数据?

与RDBMSes相比,CSV文件的一个特殊优势是它们可以很容易地压缩并移动到几乎任何其他机器上。我们进行大量数据传输,并且一切都非常简单,我们只使用一个大CSV文件,并且可以使用rsync之类的工具轻松编写脚本。为了减少大CSV文件上的重复,可以使用YAML之类的东西。我不确定我是否会存储JSON或XML之类的东西,除非您有重要的关系要求。

至于未提及的替代方案,请不要忽视Hadoop,它是MapReduce的开源实现。如果您需要分析大量结构松散的数据,并且希望只添加10台以上的计算机来处理数据,那么这应该会很好。

例如,我开始尝试分析性能,该性能实际上是在大约20台机器上记录的不同功能的所有计时编号。尝试将所有内容保留在RDBMS中之后,我意识到,聚合之后,我真的不需要再次查询数据。而且,它仅对我有用,以汇总格式显示。因此,我保留了日志文件,对其进行压缩,然后将聚合的数据保留在数据库中。

请注意,我更习惯于考虑“大”尺寸。


5
CSV文件的一种危险是转义需要正确处理。它很容易实现不真正遵循规范的CSV读取器或写入器,因为它看起来如此简单,并且存在一些微妙之处:en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

文件系统非常适合存储二进制数据,在关系型数据库中,它从来都无法出色地工作。



6

如果不需要ACID,则可能不需要RDBMS的开销。因此,请确定您是否首先需要它。此处提供的大多数非RDBMS答案都不提供ACID。


1
您能否举例说明为什么/何时不需要ACID?
Ivan Voroshilin 2013年

1
@vibneiro,如果数据库只有一个用户仅执行顺序操作,或者在断电的情况下出现数据库不一致的风险是可以接受的,或者数据库事务的概念不适用,或者不需要约束,级联,触发器等,则非ACID非RDBMS提供程序(例如具有RDBMS类API的文本文件)就足够了。例如,您的应用程序可以保留一个历史诊断消息数据库,而ACID完全不相关,并且“ log.txt”就足够了。
bzlm

事实证明,在极少数情况下不需要ACID。我想知道为什么NoSQL数据库如此受欢迎?他们中的大多数不支持完整的ACIDity。
伊万·沃罗林

@ vibneiro,NoSQL通常更容易,更轻量,更可嵌入,更可托管,更直观,更灵活,并且通常带有一些 ACID。如果没有关系数据,则可能不需要RDBMS。
bzlm

6

定制(手写)存储引擎/在某些用例中可能具有很高的性能

http://www.hdfgroup.org/

如果您拥有大量数据集,则可以使用HDF(分层数据格式),而不是自己滚动数据集。

http://en.wikipedia.org/wiki/Hierarchical_Data_Format

HDF支持几种不同的数据模型,包括多维数组,栅格图像和表格。

它也像文件系统一样分层,但是数据存储在一个魔术二进制文件中。

HDF5是一套套件,可以管理非常大和复杂的数据收集。

想想PB级的NASA / JPL遥感数据。


4

G'day,

我能想到的一种情况是,当您建模的数据无法轻松地在关系数据库中表示时。

曾经有这样一个例子的是移动电话运营商用来监视和控制移动电话网络基站的数据库。

在几乎所有这些情况下,都使用了OO DB,无论是商业产品还是允许对象层次结构的自卷式系统。

我曾为一家大型公司开发3G监控应用程序,该公司将保持匿名,但其徽标是红酒色(-:,并且他们使用此类OO DB来跟踪内部单个单元的所有各种属性。网络。

使用通常通常完全不使用SQL的专有技术来查询此类数据库。

HTH。

干杯,


4
为什么基站数据不能很好地适合于关系模型?
kaybenleroll

3

对象数据库不是关系数据库。如果您只想在数据库中填充一些对象,它们可能非常方便。它们还支持版本控制和修改数据库中已经存在的对象的类。db4o是第一个想到的。


3

在某些情况下(例如金融市场数据和过程控制),您可能需要使用实时数据库而不是RDBMS。参见维基链接


3

几年前有一个名为JADE的RAD工具,它具有内置的OODBMS。DB引擎的早期版本也支持Digitalk Smalltalk。如果要使用非RDBMS范例对应用程序构建进行示例,则可能是一个开始。

其他OODBMS产品包括ObjectivityGemStone(您将需要获得VisualWorks Smalltalk才能运行Smalltalk版本,但也有一个Java版本)。在这个领域中还有一些开源研究项目-EXODUS及其后代SHORE浮现在脑海。

可悲的是,该概念似乎死了,可能是由于缺乏清晰可见的标准以及相对于基于SQL的RDMBS系统而言相对较差的即席查询功能。

OODBMS最适合具有核心数据结构的应用程序,这些数据最好以互连节点的图表示。我曾经说过,典型的OODBMS应用程序是一个多用户地牢(MUD),其中的房间将包含玩家的化身和其他对象。


2
以前确实需要客户端Smalltalk来使用GemStone / S(用于桌面应用程序),但是使用Web框架Aida(aidaweb.si)和Seaside(seaside.st),GemStone / S可以直接用作应用程序服务器。见玻璃(资讯seaside.gemstone.com
戴尔Henrichs

另一个原因是您是否关心数据质量。在像Gemstone这样的OODB中,执行复杂的有效性规则要容易得多。
2011年

OODBMS的即席查询功能比基于SQL的RDBMS-es
好得多

1

仅使用存储在文件系统中的文件,您可以走很长一段路。RDBMS在处理斑点方面变得越来越好,但是这可能是处理图像数据等的自然方法,尤其是在查询很简单的情况下(枚举和选择单个项目)。

RDBMS中不太适合的其他内容是分层数据结构,我猜想地理空间数据和3D模型都不容易使用。

诸如Amazon S3之类的服务提供了不支持SQL的更简单的存储模型(键-值)。可伸缩性是关键。

Excel文件也很有用,特别是如果用户需要能够在熟悉的环境中操作数据并构建完整的应用程序来做到这一点不可行时。


1

有很多存储数据的方法-甚至“关系数据库”也涵盖了一系列简单代码库中的一系列替代方法,这些代码可操作本地文件,就好像它是单个用户的关系数据库一样,通过基于文件的系统,则可以处理多个用户,以选择大量的基于“服务器”的严重系统。

我们大量使用XML文件-您会获得结构良好的数据,用于查询的漂亮工具(如果适用)也可以进行编辑,这些都是人类可读的,因此您不必担心db引擎是否正常工作(或db引擎)。这对于本质上是只读的东西(在我们的情况中,通常不是从其他地方的数据库生成的东西)以及单用户系统中都非常有效,在单用户系统中,您只需加载数据并根据需要将其保存出来即可,但是您正在创造机会如果您想进行多用户编辑-至少要编辑一个文件,则会出现问题。

对于我们而言,我们将要么使用将执行SQL的功能(MS提供了一系列工具,这些工具从.DLL运行,可以一直到企业服务器执行单用户操作,并且它们都使用相同的SQL (在较低端有限制)),或者我们将使用XML作为格式,因为(对我们而言)冗长性很少成为问题。

目前,我们不必在应用程序中处理二进制数据,因此不会出现问题。

墨菲


1

如果应用程序数据本质上是面向键/值的,并且本质上是分层的,则可能需要考虑使用LDAP服务器代替传统的SQL数据库。


1

BTree文件通常比关系数据库快得多。SQLite在其中包含一个BTree库,该库位于公共域中(就像在真正的“公共域”中一样,并不宽松地使用该术语)。

坦率地说,如果我想要一个多用户系统,我需要说服很多人不要使用像样的服务器关系数据库。


BTree是普通索引的基本实现。Oracle支持按索引组织的表,这些表只是作为索引实现的表。它们的读取速度更快,写入和使用B树的速度较慢。请参阅:< oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

全文数据库,可以使用邻近运算符查询,例如“ 10个字以内”等。

关系数据库是实现多种目的的理想业务工具-易于理解和设计,足够快速,足够,即使不是由天才可以“充分利用”的天才设计和优化的。

但是某些业务目的需要全文本索引,而关系引擎要么不提供,要么事后才考虑。特别是,法律和医学领域有大量的非结构化文本可以存储和使用。


1

另外:*嵌入式方案-通常要求使用比成熟RDBMS小一些的方案。Db4o是在这种情况下可以轻松使用的ODB。*快速或概念验证的开发-您希望专注于业务而不用担心持久层



1

吻:保持小而简单


1
那是有礼貌的版本……我更经常听到“保持简单,愚蠢”……或者大呼小叫,也许这就是人们告诉我的!:-(
GreenMatt

1

我会提供RDBMS :)如果您不会在设置/管理方面遇到麻烦,请使用SQLite。内置的RDBMS具有完整的SQL支持。它甚至允许您将任何类型的数据存储在任何列中。

相对于例如日志文件的主要优势:如果您有一个很大的日志文件,您将如何在其中搜索?使用SQL引擎,您只需创建索引并大大加快操作速度。

关于全文搜索:SQLite也具有用于全文搜索的模块。

只需享受漂亮的标准数据接口即可:)



0

我强烈建议使用Lua替代SQLite类的数据存储。

因为:

  • 该语言最初被设计为数据描述语言。
  • 该语法易于阅读(XML 不是
  • 可以将Lua块编译为二进制文件,以提高性能

这是已接受答案的“本机语言收集”选项。如果您使用C / C ++作为应用程序级别,则仅出于读取配置/数据或将其写入的目的而引入Lua引擎(100kB二进制)是完全合理的。


Lua是一种编程语言。该建议可以概括为建议任何编程语言的任何持久性/序列化功能(例如,Python中的pickle / shelve或Perl等人的JSON / YAML,等等)。这根本不能解决并发访问和ACID保证。
Jim Dennis 2010年

你是对的。我的文章中缺少的是这种用法的隐式只读性质。在这种情况下,我坚持我的文字。对于以这种方式读写Lua绝对没有任何意义。在很多情况下,文件系统元数据大多是只读的,因此这种方法并不意味着完整的ro要求。
akauppi,2010年
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.