我使用关系数据库已经有一段时间了,但直到最近我才意识到一定还有其他类型的数据库 -关系性的。

非关系数据库有哪些示例?它们在现实世界中的何处/如何使用?为什么选择使用非关系数据库而不是关系数据库?

编辑: :答案中还提到了另外两个类似的问题:

有帮助吗?

解决方案

  • 平面文件
    • CSV 或其他分隔数据
    • 电子表格
    • /etc/密码
    • mbox 邮件文件
  • 分层的
    • Windows注册表
    • Subversion 使用文件系统 FSFS,而不是 Berkley DB

其他提示

诚然,这里提到的数据库类型的一个晦涩但有趣的替代方案是 关联数据库, ,例如句子,来自 懒软科技. 。您可以下载免费的个人版本并自行尝试。企业版也是免费的,但需要向公司提出请求。

从本质上讲,关联数据库允许您以与我们的大脑大致相同的方式存储信息:作为事物以及这些事物之间的关联。“句子”这个名字来自于这些信息可以用一个句子来表示的方式。 主语-动词-宾语 句法:

  • 汤姆 是兄弟 劳拉
  • 旧金山 位于 加利福尼亚州
  • 麦克风 信用额度为 $10,000

一个句子可以是另一个句子的主语或宾语:

  • (570路公交车 到达 上午 8:15) 周日
  • 玛丽 (馅饼 被烘烤 威廉)

所以,一切都可以归结为 实体协会.

当然,句子的内容远比这里所能表达的要多得多。我建议您花一些时间阅读有关它的更多信息 白皮书 来自 LazySoft。

《数据的关联模型》 是由《Sentences》的创作者之一西蒙·威廉姆斯 (Simon Williams) 提供的 PDF 格式书籍。

我们一直在研究的面向非关系文档的数据库是 Apache CouchDB.

Apache CouchDB 是一个分布式、容错且无模式的面向文档的数据库,可通过 RESTful HTTP/JSON API 进行访问。除其他功能外,它还提供具有双向冲突检测和解决功能的稳健增量复制,并且可以使用面向表的视图引擎(以 JavaScript 作为默认视图定义语言)进行查询和索引。

我们的兴趣是提供一个分布式访问用户首选项存储,该存储将不受形状变化的影响,我们可以从 Java 序列化首选项对象,并使用基于 XULRunner 的客户端应用程序中的 Javascript 轻松访问这些对象。

任何声称是“伯克利风格数据库”或“键/值”数据库的数据库都不是关系型的。

这些数据库通常基于复杂的哈希算法,并提供基于键的非常快速的 O(1) 查找,但将任何形式的关系优点留给最终用户。

例如,在关系数据库中,您可以标准化结构并将许多表连接在一起以创建单个结果集。

在键/值数据库中,您将尽可能地非规范化,然后使用唯一的键来查找数据。

如果您需要从两个源提取数据,则必须手动将结果集连接在一起。

所有数据库最初都是非关系型的,直到 20 世纪 80 年代中期 DB2 和 Oracle 的出现才变得普遍。在此之前,大多数数据库都是平面文件或分层文件。

平面文件本质上很无聊,但分层数据库则不然,特别是因为 DB2 实际上首先是在分层实现(即 VSAM)之上实现的。我相信 VSAM 仍然存在于大型机系统上,并且具有相当重要的意义。

DB/1(现在如此晦涩难懂,我什至找不到维基百科链接)是 IBM 的 DB2(因此得名)的前身黄金时段数据库。这是分层的 - 基本上你有一个由任意数量或“根”记录组成的文件,通常可以通过密钥直接访问。每个根记录可以有任意数量的子记录,每个子记录又可以有自己的子记录。最终效果是索引文件或根记录,每个根都是潜在树状结构的顶部。访问子记录可能很棘手 - 直接访问存在限制,因此通常您最终会遍历树来查找所需的记录。“数据库”中可以包含任意数量的这些文件,通常通过键关联。

这有很大的缺点 - 尤其是实际上做任何事情都需要编写完整的程序 - 基本上相当于我们现在在 SQL 中几分钟内完成的工作需要一天的时间。然而,它确实在执行速度上得分,在那些日子里,大型机的处理能力与 iPhone 相当(尽管针对数据 I/O 进行了优化),而糟糕的 DB2 查询可能会毁掉价值数百万美元的安装。这对于 DB/1 来说从来都不是问题,而且在程序员的成本低于 CPU 时间的世界中,这是有意义的。

Google App Engine 数据存储区 :

App Engine 数据存储区不是关系数据库。虽然数据存储界面具有许多与传统数据库相同的功能,但数据存储的独特特性意味着设计和管理数据的不同方式,以利用自动扩展的能力。

OSIsoft 的 PI 历史数据库是非关系型的。它仅用于存档带时间戳的数据。它被行业广泛使用,特别是作为所有这些“仪表板”的后端数据库。

其中不需要有关系,因为没有连接。

其他两类数据库还没有出现:

  1. 内容存储库是为内容设计的数据库(即文件、文档、图像等)。它们通常具有附加结构,例如浏览内容的分层方式、搜索、不同格式之间的转换、版本控制和许多其他内容。示例 - Alfresco、Documentum、JackRabbit、Day、OpenText 以及许多其他 ECM 供应商。

  2. 目录,即Active Directory 或 LDAP 目录。这些数据库专为低写入/高读取场景而设计,并且在高地理距离/高延迟连接中高度分布。虽然主要用于身份验证/授权,但如果您的用例符合要求,则不必如此。

维度数据库是非关系数据库的一个很好的例子。它们非常常用于 KPI 和其他类型的汇总或统计数据的“业务仪表板”/“商业智能”。它们通常由关系数据库填充,并且在某些情况下可以提供更好的性能。

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

  1. XML 数据库例如 新迪塞
  2. 对象数据库例如 数据库4o

请注意,关系数据库的概念非常有争议。纯粹主义者如 C。J。日期 有人认为,许多常用数据库(例如 Oracle 和 SQL Server)并不充分符合被称为“关系”的关系模型。

非关系数据库无法满足 Codd 的要求。Intersystems Caché 对旧 Pick 操作系统的数据库进行了彻底的重写/重新设计。从我对 Caché 的了解来看,它似乎是一个做得很好的重新设计。它允许 .net 程序像 SQL 一样访问数据库。Caché 运行的是 Pick OS 程序,无需任何更改。通过将 Pick 文件导入 Caché,您仍然可以用它运行旧的绿屏应用程序,还可以使用 .net 编写新程序,这样您就可以迁移到 Windows 应用程序,而无需放弃您已经投入多年的数据设计。以下是 Pick DB 模型的一些背景信息。Pick 数据库使用完全可变长度的记录和字段。所有表都由单个唯一键作为键,并且无需读取索引即可访问。Pick 设计的系统使用哈希算法,通常在第一次物理读取时从磁盘读取项目(假设系统维护正确执行)。Pick 中的字段是非类型化的。所有数据都存储为字符串,转换由程序员决定。空值存储为空字符串,因此空值不会像 SQL 中那样占用磁盘空间。不需要外键。在“关系世界”中,DBA 必须创建订单表头表和订单行项目表。在“选择模型”中有一个表。例如,“订单日期”是一个字段,用于存储自“1967 年 12 月 13 日”(数据挑选操作系统首次打开)以来的天数。Pick 程序员没有遇到 Y2k 问题。第二列是客户编号。最大的区别是,当您进入“产品编号”列时,它将是“多值”(Codd 不合格项)。换句话说,数据库可以处理该列中的 1-32000 个产品#。其他列(例如“订购数量”)将与“产品编号”处于控制/依赖关系,并且也是多值的。当您到达“发货数量”时,“挑选”将进入第三个维度并具有“子多值”字段。您将有一个装运编号列,并且它将按行项目进行多值和子多值包含该装运编号的该行的装运数量。不需要内部联接。该订单的所有数据都存储在一个表和一条记录中。从来没有孤行!其次,数据定义有点不同。我们的字典可以包含不在该表中或正在被操作的数据的定义。几个例子是,客户名称。它将被定义为“使用客户编号列并从客户表返回名称字段”。另一个例子是行项目扩展将被定义为数量*价格/每件价格的计算。我相信我在某处读到过 Caché 声称安装量超过 100,000 次。

我认为 Excel 中的平面文件数据库是非关系型的,并且被很多人使用。

它实际上只是一个数据库表,无法与其他表连接。

面向对象数据库是一种有趣的非关系数据库类型。

贸易部门有时使用 OO 数据库,因为每笔交易/合同可能看起来有点像该类别中的其他交易/合同,但也具有独特的属性。很难用关系来表示它。

存在数据库 是一个已经存在很长时间的 xml 数据库。它特别适用于 查询 超过大量的 xml 文档。

包含数据但不表达该数据内的关系的任何文件或文件组都是非关系数据库。

RRD工具 旨在存储和聚合日志数据。您配置采样间隔并向其中输入数据,然后它返回基于时间的结果。它针对固定大小的存储进行了优化,并在一段时间后开始聚合过去的结果。例如,假设您有一个时间间隔为 5 分钟的循环数据库。即使您每秒向其发送一次温度数据,它仍然只以 5 分钟为增量存储结果。一周后,它将这些结果平均化为每小时的值。一个月后,将每小时的结果平均化为每日的数字,依此类推。

RRDtool 通常用作诸如以下工具的后端 蟋蟀MRTG 连续数月甚至数年跟踪网络和环境数据。

对于基于图形的 dbms,您有 neo4j

对于分层 dbms,您可以使用任何标准文件系统或“模式”支持任何 LDAP 实现。

有很多答案,但它们最终都属于两大类之一:

  1. 导航。包括树/层次结构数据库和图数据库。

  2. 打破第一范式(多个值)的数据库。包括 Pick 数据库和 Lotus Notes 及其后代,例如 CouchDB。

编辑:当然,像 BDB 这样的键/值存储不是关系型的,但这不言而喻不是吗?我的意思是,它们只是键/值存储。

dBase。虽然它是这样销售的,但它不符合要求。

作为一个面向对象的数据库,我想到的是 Intersystems Caché。一些医疗和图书馆系统就是在此基础上构建的。

  1. 在我的公司 www.smartsgroup.com 中,我们有一个专有的数据库引擎,我们称之为“事务日志数据库”。它基于平面文件构建,每个文件包含一系列二进制格式的“事件”或“消息”,以及该数据的各种索引和用于再现证券交易所订单簿状态的算法。它针对顺序更新和顺序访问进行了高度优化。

  2. 在科学应用中,使用专有数据库引擎而不是 RDBMS 也很常见。我还曾在一家拥有世界上最大的脑电图脑记录数据库的公司工作:www.brainresource.com 。在那里,我们使用平面文件数据库,它对我们来说效果很好。

  3. SmartsGroup 还使用时态数据库,它类似于非关系数据库表,不同之处在于我们存储所有字段的所有更改的历史记录,以便我们可以重现特定日期特定行的状态。

上面链接的维度数据库的 Wiki 页面似乎已经消失。

一些 联机分析处理 系统由多维数据库 (MOLAP) 支持,这些数据库经常用于财务分析。它们提供交互式客户端,允许用户浏览不同聚合级别的数据。

在我的大学有一个研究小组 演绎数据库.

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