查看源代码 概述

电信系统中的数据管理有很多方面,其中一部分(但不是全部)可以通过传统的数据库管理系统(DBMS)来解决。特别是,许多不间断系统所需的高级别容错,加上对 DBMS 在与应用程序相同的地址空间中运行的要求,促使我们实现了一个新的 DBMS,称为 Mnesia。

Mnesia 是用 Erlang 实现的,并与之紧密耦合。它提供了实现容错电信系统所必需的功能。

Mnesia 是一个多用户分布式 DBMS,专门为用 Erlang 编写的工业级电信应用设计,这也是其目标语言。Mnesia 试图解决典型电信系统所需的所有数据管理问题,并具有传统 DBMS 中通常不具备的许多功能。

电信应用需要一系列广泛的功能组合,而这些功能通常不是传统 DBMS 所能提供的。Mnesia 的设计旨在满足以下要求:

  • 快速实时键值查找
  • 复杂的非实时查询(主要用于操作和维护任务)
  • 分布式数据(由于应用程序的分布式特性)
  • 高容错
  • 动态重配置
  • 复杂对象

Mnesia 解决了电信应用所需的典型数据管理问题,这使其与大多数其他 DBMS 不同。它结合了传统 DBMS 中发现的许多概念,例如事务和查询,以及电信应用数据管理系统中发现的概念,例如

  • 快速实时操作
  • 用于容错的可配置复制
  • 无服务中断的动态重配置

Mnesia 的独特之处还在于它与 Erlang 的紧密耦合。它几乎将 Erlang 变成了一种数据库编程语言,这带来了许多好处。最重要的是,DBMS 使用的数据格式与用于操作数据的编程语言使用的数据格式之间的阻抗不匹配完全消失了。

Mnesia 数据库管理系统

功能

Mnesia 具有以下功能,这些功能结合起来产生一个用 Erlang 编写的容错分布式数据库管理系统(DBMS)

  • 数据库模式可以在运行时动态重新配置。
  • 可以声明表具有诸如位置、复制和持久性之类的属性。
  • 可以将表移动或复制到多个节点以提高容错能力。系统中的其他节点仍然可以访问这些表来读取、写入和删除记录。
  • 表的位置对程序员是透明的。程序寻址表名,系统本身跟踪表的位置。
  • 事务可以是分布式的,并且可以在单个事务中执行多个操作。
  • 多个事务可以同时运行,它们的执行由 Mnesia 完全同步,确保没有两个进程同时操作相同的数据。
  • 可以为事务分配在系统中所有节点上执行或不在任何节点上执行的属性。
  • 可以使用脏操作绕过事务,从而减少开销并快速运行。

所有上述功能将在接下来的章节中详细描述。

查询列表推导式

查询列表推导式(QLC)可以与 Mnesia 一起使用,以生成增强其操作能力的专用函数。QLC 在 OTP 文档集中有自己的文档。与 Mnesia 一起使用时,QLC 的主要优点是

  • QLC 可以优化 Mnesia 的查询编译器,从而有效地提高系统效率。
  • QLC 可以用作 Mnesia 的数据库编程语言。它包括一个称为列表推导式的表示法,该表示法可用于对一组表执行复杂的数据库查询。

有关 QLC 的更多信息,请参阅 STDLIB 中的 qlc 手册页。

何时使用 Mnesia

Mnesia 非常适合以下应用:

  • 需要复制数据。
  • 执行复杂的数据查询。
  • 需要使用原子事务来安全地同时更新多个记录。
  • 需要软实时特性。

Mnesia 不太适合以下应用:

  • 处理纯文本或二进制数据文件。
  • 仅仅需要可以存储在磁盘上的查找字典。此类应用程序可以使用标准库模块 dets,它是 ets 模块的基于磁盘的版本。有关 dets 的更多信息,请参阅 STDLIB 中的 dets 手册页。
  • 需要磁盘日志记录设施。此类应用程序可以使用模块 disk_log。有关 disk_log 的更多信息,请参阅 Kernel 中的 disk_log 手册页。
  • 需要硬实时特性。