单文件数据库是一种将数据存储在单个文件中的数据库。特别适合嵌入式系统、边缘设备、移动端设备的数据库应用、管理和部署。例如:SQLite、RocksDB、DuckDB、TinyDB等。
这种数据库比较适用于轻量级客户端程序、IoT应用、移动应用和嵌入式系统,因为这类系统对数据库的简单性和易用性要求更多,具有较好的可靠性,性能,并且开箱即用。
下面是几个著名的开源嵌入式单文件数据库。
1.SQLite
https://github.com/sqlite/sqlite
SQLite是一个独立的、无服务器的、零配置的数据库引擎。它是一个实现轻量级、基于磁盘的数据库的C库。SQLite因其简单性和效率而被广泛使用,使其成为嵌入式系统、移动的设备和小规模应用的理想选择。
特点:符合ACID,支持大多数SQL标准,零配置,跨平台。
场景:移动的应用程序、嵌入式系统、应用程序的本地存储。
2.LiteDB
https://github.com/mbdavid/LiteDB
LiteDB是一个轻量级的、开源的NoSQL数据库,专为.NET应用程序设计。它将数据存储在单个文件中,并使用BSON格式。LiteDB是无服务器的,易于部署,并支持LINQ查询。它适用于中小型应用程序,为开发人员提供快速性能、ACID事务和简单的API。
特性:ACID事务,LINQ支持,无需配置,BSON格式。
场景:.NET应用程序、中小型数据存储、原型设计。
3.Realm
https://github.com/realm
Realm是一个移动的数据库,旨在实现简单性和速度。它支持iOS和Android,提供实时数据同步。Realm易于使用,具有丰富的面向对象的API,并且不需要ORM。它适用于离线优先的应用程序,并有效地处理复杂的数据结构。Realm兼容多种编程语言,如:Java、JavaScript、C#等,这使其成为iOS、Android、React和Xamarin等开发平台的首选数据库。
特点:面向对象,跨平台(iOS、Android、.NET),实时同步功能。
场景:移动的应用程序、实时数据应用程序、离线应用程序。
4.UnQLite
https://github.com/symisc/unqlite
UnQLite是一个嵌入式NoSQL数据库引擎。它支持键值存储和文档存储模型。UnQLite是无服务器的,轻量级的,需要最少的设置,使其成为需要快速数据存储的嵌入式系统和应用程序的理想选择。它无需单独的服务器进程即可运行,并提供高性能和灵活性。
特性:键/值存储,文档存储,ACID事务,零配置。
场景:嵌入式系统、物联网设备、简单的Key-Value数据存储的应用。
5.H2 Database
https://github.com/h2database/h2database
H2数据库是基于Java的SQL数据库。它可以嵌入或运行在客户端/服务器模式。H2是快速、轻量级的,并且支持标准SQL,提供内存和基于磁盘的表。因此特别适用于Java应用程序。
特点:支持内存和持久存储,占用空间小,全面的SQL支持。
场景:Java应用程序、开发和测试环境、轻量级生产系统。
Java Maven:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.3.230</version>
</dependency>
6.LowDB
https://github.com/typicode/lowdb
LowDB是一个小型的,基于JavaScript的JSON数据库,用于Node.js和浏览器。它使用一个简单的基于文件的存储系统,并通过一个简单的API支持查询和数据操作。LowDB是原型设计、小型项目和低开销应用程序的理想选择。
特性:内存或持久化存储,简单快速的API,模式灵活。
用例:小型项目、配置存储、轻量级本地数据库。
7.RocksDB
https://github.com/facebook/rocksdb
RocksDB是Facebook开发的高性能嵌入式键值存储。它基于LevelDB,并针对数据的快速存储和检索进行了优化。RocksDB支持事务、列族和微调性能选项等高级功能,使其适合高吞吐量和低延迟应用程序。它广泛用于需要高效存储解决方案的数据密集型系统和应用程序。
特性:优化快速存储,支持键值对,高级配置进行性能调整。
场景:需要高性能读写操作的应用程序,大型数据集。
8.DuckDB
https://github.com/duckdb/duckdb
DuckDB是一个进程内、列式SQL OLAP数据库管理系统。它旨在实现快速的分析查询性能,并可以嵌入到应用程序中。
DuckDB支持复杂查询、ACID事务,并与数据科学工具集成良好。它适用于小型和大型数据集上的分析工作负载,提供高性能和易用性。
特性:支持复杂查询,列式存储,单文件存储,SQL支持。
场景:分析工作负载、数据科学、应用内分析。
//使用SQL导入文件数据
SELECT * FROM 'myfile.csv';
SELECT * FROM 'myfile.parquet';
9.PouchDB
https://github.com/pouchdb/pouchdb
PouchDB是一个开源的JavaScript数据库,设计用于在浏览器中运行。它使应用程序能够在本地存储数据,并与CouchDB或兼容的服务器同步。PouchDB支持离线功能,在设备之间复制数据,并使用简单的API。它非常适合需要离线功能和实时数据同步的Web和移动的应用程序。
特点:与CouchDB等兼容服务器同步,支持本地存储,基于JSON。
场景:离线优先应用程序、需要同步功能的Web和移动的应用程序。
10.TinyDB
https://github.com/msiemens/tinydb
TinyDB是一个轻量级的,面向文档的数据库,用纯Python编写。它将数据存储在JSON文件中,并提供简单易用的API来管理数据。TinyDB是无模式的,允许灵活的数据存储,并支持查询,索引和基本的CRUD操作。
特性:轻量级、开发人员友好的API、无模式设计、最小依赖、可扩展
场景:小型应用、原型设计、配置、物联网和桌面应用
# python
from tinydb import TinyDB, Query
db = TinyDB('path/to/db.json')
User = Query()
db.insert({'name': 'John', 'age': 22})
db.search(User.name == 'John')
[{'name': 'John', 'age': 22}]
TinyDB & SQLite如何选择?
如果你需要一个快速、简单的数据存储解决方案,TinyDB可能是一个更好的选择,特别是对于小型项目和不需要复杂查询的应用。如果你需要处理复杂的数据关系、执行复杂的查询,或者需要数据库具有事务处理能力,那么SQLite将是一个更合适的选择,尤其适用于大型企业级应用和需要高数据完整性的场景。
以上每一种数据库产品都具有独特的优势,适用于各种应用场景,在移动应用、边缘节点、物联网等场景应用中,可根据实际技术架构进行选型。