什么是嵌入式数据库?
嵌入式数据库主要有两种定义:
- 用于嵌入式系统(如移动设备或消费电子产品)的数据库。嵌入式数据库需要占用空间小,并在内存和CPU能力有限的环境中提供足够的性能。
- 嵌入到应用程序中的数据库--这意味着应用程序不与数据库服务器通信,而是内置数据库组件。这种类型的数据库通常用于边缘计算应用。
在这两种定义中,嵌入式数据库系统是一组与应用或固件代码相关联的库,为应用或设备提供内置数据库功能。这不同于客户端/服务器数据库系统,在客户端/服务器数据库系统中,另一个进程(数据库服务器)为一个或多个客户端应用程序提供数据库服务。
特点:
- 具有不同应用编程接口(SQL以及专有、本地API)的数据库系统
- 数据库架构(客户端-服务器和进程内)
- 存储模式(磁盘存储、内存存储和组合存储)
- 数据库模型(关系型、面向对象型、实体-属性-值模型、网络/CODASYL)
- 特定市场
嵌入式系统的特点
嵌入式系统是计算机硬件和软件的组合,旨在执行特定功能。例如智能手机、数码相机和联网汽车。嵌入式系统具有以下特点:
- 由硬件、固件和软件组成
- 为特定系统任务而设计,因此通常集成到更大的系统中
- 计算能力由集成电路(微处理器或微控制器)提供
- 通常需要在时间限制下执行任务,以支持更大系统中的其他组件
嵌入式数据库的要求
要了解一个数据库是否适合用作嵌入式数据库,请考虑以下要求:
- 是否支持CRUD(创建、读取、更新、删除)?
- 是否支持ACID(原子性、一致性、隔离性、持久性)?
- 能否使用不同的编程语言和操作平台?
- 是否可以方便地将数据转移到中央数据库?
- 是否无需数据库管理员进行维护?
在几乎所有的嵌入式数据库应用中,嵌入式应用都需要存储多个复杂的数据流,以便进行分析和操作。它们必须能够接收来自多个来源的数据,并同时执行读写操作。数据库不仅需要存储数据,还必须保持完整性,并能够在系统发生故障时进行恢复。
您可以使用基本的CRUD功能来修改数据,但它不能保证数据完整性。ACID提供了更好的完整性级别,并且能够支持事务场景。在嵌入式场景中,数据记录通过多条语句写入数据库。下面介绍ACID如何帮助支持这种需求:
- 原子性要求数据库允许或拒绝构成记录的所有语句。
- 一致性有助于防止可能破坏数据的部分更改。
- 隔离性允许您同时写入多个数据记录,而不会相互影响。
- 持久性意味着,如果记录已提交,即使系统发生故障,该记录也会保持提交状态。
不符合ACID要求会增加数据库损坏的风险。在拥有成百上千台设备的环境中,更有可能发生错误,因此ACID合规性变得更加重要。
嵌入式数据库的类型
嵌入式场景中使用的数据库主要有三种类型。
传统SQL数据库可用于嵌入式系统,但通常必须牺牲存储空间或功能。有些数据库仅实现部分SQL语法,或提供弱类型SQL语法,无法保证完整性。
时间序列数据库测量、跟踪、调查和自动处理时间敏感型数据流。时间序列数据库为了速度牺牲了一些ACID功能。例如,如果您的系统正试图优化写入次数,记录锁定的时间可能会缩短,这可能会降低一致性。
数据历史系统收集并存储大量带有时间戳的数据。数据历史器通常内置于设备中,主要用于收集和传输信息,分析能力有限。它可以提供SQL查询界面,但不一定遵循标准SQL语法。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
嵌入式数据库: SQL与API
在许多嵌入式系统中,需要在SQL访问数据库(通常使用JDBC/ODBC)与专有API访问之间做出选择。让我们来看看每种方法的优缺点。
使用SQL访问嵌入式数据库
- SQL众所周知,对开发人员和管理员非常有用。
- 提供灵活的查询功能。
- 能够同时对多条记录应用UPDATE或DELETE语句,而非SQL API则单独处理每条记录。
- 能够同时对多条记录应用UPDATE或DELETE语句,而非SQL API则单独处理每条记录。
- 解析、优化和执行查询所需的开销很高。这些步骤会占用CPU周期、内存和其他稀缺资源。
- SQL通常与其他系统不完全兼容,例如与面向对象编程不兼容。这被称为 "阻抗失配"。为了解决这个问题,引入了对象关系映射(ORM object-relational mapping),但它增加了更多的开销。
使用专有API访问嵌入式数据库
- 避免了阻抗失配,因为嵌入式数据库及其API是由同一家公司设计的。
- 消除了处理SQL查询的开销,允许直接访问数据。
- 使用专有API是一项专业技能,团队成员必须学习。
- 锁定在特定的数据库系统中,如果该系统不符合要求,则很难迁移。
变更数据捕获(CDC)和嵌入式数据库
在许多嵌入式系统中,CDC(Change Data Capture )用于识别哪些数据发生了变化,并为将来的目的保存数据变化。这可以实现数据库恢复、复制和处理流事件。
在嵌入式数据库中,变化数据捕获提供了三种主要功能:
- 事务记录-在数据库崩溃后,使用UNDO和REDO操作检索数据库事务。
- 触发器-当数据库检测到INSERT、UPDATE或DELETE操作时调用的动作。
- 复制-CDC可以支持多种复制模式:
- 复制已提交的事务(镜像或事务复制)
- 复制已提交和未提交的事务(日志传输)
常见实现
- Advantage Database Server from Sybase Inc.
Sybase的Advantage Database Server(ADS)是一个嵌入式数据库管理系统。它提供ISAM和关系型数据访问,兼容多种平台,包括Windows、Linux和Netware。它既可以是免版税的本地文件服务器数据库,也可以是完整的客户服务器版本。ADS具有高度可扩展性,无需管理,支持多种集成开发环境。
- Berkeley DB from Oracle Corporation
Oracle的嵌入式数据库实际上是Berkeley DB,是Oracle从Sleepycat软件公司收购的。Berkeley DB是一个快速、开源的嵌入式数据库,被用于多个著名的开源产品,包括Linux和BSD Unix操作系统、Apache Web服务器、OpenOffice生产力套件。然而,近年来许多知名项目转而使用LMDB,因为LMDB在 "少即是多 "的设计基础上,在关键场景中的性能优于Berkeley DB,而且许可证也发生了变化。
Apache Derby
Derby是一个完全用Java编写的可嵌入的SQL引擎。Derby是一个成熟的引擎,在Apache许可下免费提供,并得到积极的维护。Derby项目页面。它也作为Oracle的Java SE开发包(JDK)的一部分以Java DB的名义发布。DuckDB from DuckDB Labs
CSQL from csqlcache.com
Extensible Storage Engine from Microsoft
eXtremeDB from McObject
McObject LLC推出的eXtremeDB是第一个为实时嵌入式系统从零开始设计的内存嵌入式数据库。最初的产品很快被用于容错应用的eXtremeDB高可用性(HA)加入。现在,该产品系列包括64位版本和事务日志版本,以及混合型eXtremeDB Fusion,它结合了内存和磁盘数据存储。2008年,McObject推出了eXtremeDB Kernel Mode,这是第一个设计用于在操作系统内核中运行的嵌入式DBMS。
- Firebird Embedded
- HSQLDB from HSQLDB.ORG,
- Informix Dynamic Server (IDS) from IBM
Informix Dynamic Server (IDS)的特点是作为企业级可嵌入式数据库服务器,结合了可嵌入式特性(如低占用空间、可编程和自主能力)和企业级数据库特性(如高可用性和灵活的复制特性)。 IDS被用于深度嵌入式场景,如IP电话呼叫处理系统、销售点应用和金融交易处理系统。
- InfinityDB from Boiler Bay Inc.
nfinityDB嵌入式Java DBMS是一个排序的分层键/值存储。它现在有一个加密版和一个客户端/服务器版。多核速度已申请专利。InfinityDB是安全的、事务性的、可压缩的和健壮的,只需一个文件就可以立即安装和零管理。API包括简单快速的 "ItemSpace"、ConcurrentNavigableMap视图和JSON。RemoteItemSpace可以将嵌入式API透明地重定向到其他数据库实例。客户端/服务器包括一个轻量级的Servlet服务器、web管理和数据库浏览,以及用于python的REST。
- InnoDB from Oracle Corporation
- InterBase (Both server and mobile friendly deeply embedded version) from Embarcadero Technologies
InterBase是一个屡获IoT大奖的跨平台、支持Unicode的SQL数据库平台,可嵌入到交钥匙应用中。支持开箱即用的SMP和磁盘AES强度256位加密,符合SQL 92和ACID标准,支持Windows、LevelDBMacintosh、Linux、Solaris、iOS和Android平台。是中小型企业和大型企业支持数百个用户和移动应用开发的理想选择。InterBase Light是一个免费版本,可在任何移动设备上使用,是移动应用的理想选择。随着对变更管理和安全性要求的提高,企业可以切换到付费版本。InterBase在国防、空域、石油和天然气以及制造行业的应用率很高
- KùzuDB
- LanceDB
- LevelDB
LevelDB是Google创建的有序键/值存储,是Bigtable存储设计的轻量级实现。作为一个库(这是使用LevelDB的唯一方法),它的本地API是C++。它还为大多数功能提供了官方的C语言封装。第三方API封装包适用于Python、PHP、Go(纯Go LevelDB实现已经存在,但仍在开发中)、Node.js和Objective C。
[图片上传失败...(image-d4aeb8-1689030717397)]
- Lightning Memory-Mapped Database (LMDB) from Symas Corp.
闪电内存映射数据库(LMDB)是OpenLDAP项目的内存映射键值数据库。它是用C语言编写的,其API仿照Berkeley DB API,但已大大简化。该库非常紧凑,编译后的x86目标代码不到40KB,通常比Berkeley DB、LevelDB等类似库更快。该库实现了具有多版本并发控制(MVCC)、单级存储、写入时复制功能的B+树,并提供了无死锁的完全ACID事务。该库针对高读取并发性进行了优化;读者完全不需要锁。读取器不会阻塞写入器,写入器也不会阻塞读取器,因此读取性能在任意多线程和CPU上完全线性扩展。第三方封装程序适用于C++、Erlang和Python。LMDB由OpenLDAP项目根据OpenLDAP公共许可证发布。自2013年起,OpenLDAP项目不再使用Berkeley DB,转而使用LMDB。
- Mimer SQL
专有的Mimer SQL关系数据库服务器有一个嵌入式零维护版本。它采用模块化设计,占用空间小,完全支持SQL标准,并可移植到Windows、Linux、Automotive Grade Linux、Android、QNX、INTEGRITY等平台。
- MonetDB/e
MonetDB/e是开源MonetDB SQL列存储引擎的嵌入式版本。可用于C、C++、Java (JDBC)和Python。MonetDB许可证,基于MPL 2.0。前身MonetDBLite(用于R、Python和Java)已不再维护。取而代之的是MonetDB/e。
- MySQL Server Embedded
嵌入式MySQL服务器库提供了常规MySQL的大部分功能,它是一个可链接的库,可以在客户端进程的上下文中运行。在初始化之后,客户端可以使用与单独的MySQL服务器相同的C API调用,但通信开销较小,并且不需要单独的数据库进程。
- NexusDB
NexusDB是FlashFiler数据库的商业继承者,FlashFiler数据库现在已经开源。它们都可以嵌入到Delphi应用程序中,创建具有完整数据库功能的独立可执行文件
- Raima Database Manager from Raima
该产品在两种意义上是嵌入式的:首先,它嵌入到应用程序中,成为应用程序的扩展;其次,由于其占用空间小、运行高效,它可以在嵌入式计算机/操作系统或实时环境中使用。它的API(用于C/C++、SQL、JDBC、ODBC、ADO.NET和RESTful)是为支持嵌入式环境的有限资源而设计的。
- RocksDB
RocksDB创建于Facebook,最初是LevelDB的一个分叉。 它专注于性能,尤其是在SSD上的性能。它增加了许多功能,包括事务、 备份、 快照、 Bloom过滤器、 列族、 过期、 自定义合并操作符、 更可调的压缩、 统计收集、 和地理空间索引。 它被用作其他几个数据库的存储引擎,包括ArangoDB、 Ceph、 CockroachDB、 MongoRocks、 MyRocks、 Rocksandra、 TiKV、 和YugabyteDB。
[图片上传失败...(image-f42ed5-1689030717397)]
- solidDB
Solid DB是一种磁盘/内存混合型关系数据库,通常用作电信设备、网络软件和类似系统中的嵌入式系统数据库。内存数据库技术用于实现每秒数以万计的事务吞吐量,响应时间以微秒计算。高可用性选项始终保持两份数据同步。如果系统发生故障,应用程序可在一秒钟内恢复对实体数据库的访问,而不会丢失数据。
- SQLite(霸主)
SQLite是一个软件库,它实现了一个自包含、无服务器、零配置、事务型SQL数据库引擎。SQLite是世界上部署最广泛的SQL数据库引擎。SQLite的源代码(主要是C语言)属于公共领域。它包括本地C库和简单的数据库命令行客户端。
[图片上传失败...(image-1ee9a8-1689030717397)]
- SQL Server Compact from Microsoft Corporation
SQL Server Compact是微软的嵌入式数据库,具有多种功能,如多进程连接、T-SQL、与任何后端数据库同步的ADO.NET同步服务、与SQL Server的合并复制、编程API、LINQ to SQL、LINQ to Entities、ADO.NET: 编程API:LINQ to SQL、LINQ to Entities、ADO.NET。该产品可在桌面和移动Windows平台上运行。该产品已在市场上销售了很长时间,被许多企业用于生产软件(案例研究)。该产品经历了多次品牌重塑,曾有多个名称,如 SQL CE、SQL Server CE、SQL Server Mobile、SQL Mobile。
- Sophia Embeddable key-value storage