当前位置: 首页 > 科技观察

JavaScript应用程序的前五位嵌入式数据库

时间:2023-03-11 22:28:37 科技观察

我们习惯于将数据库视为巨大的存储平台,我们可以在其中存储我们需要的所有数据,然后通过某种形式的查询语言检索它。扩展这些数据库、保持信息的一致性和容错性本身就是一个挑战。但是当我们的数据需求非常小时会发生什么?当RedShift、BigQuery甚至MySQL的解决方案对于我们的小数据需求而言过于庞大时会发生什么?好吧,事实证明,有一个应用程序可以解决这个问题。事实上,有很多选择,所以在这里,我将介绍排名前5位的嵌入式数据库,以满足您的小数据需求。什么是嵌入式数据库?当我们读到“嵌入式”这个词时,90%的人认为我在谈论物联网或移动设备。但这种情况并非如此。无论如何,这不是唯一的案例。不可否认,这些系统的资源非常有限,这使得大多数传统数据库系统难以在那里配置和安装。但是小型数据库还有其他用例,那就是将它们嵌入到软件产品中。例如,想象一下在大型代码存储库中通过IDE进行搜索。IDE可以嵌入一个倒排索引数据库,让您可以搜索关键字并快速获取相关文件的引用。或者在您最喜欢的电子邮件桌面客户端上执行搜索时,它很可能也有一个嵌入式数据库。所有电子邮件都存储在那里并编入索引,因此您可以快速轻松地访问信息。到目前为止,您可能已经了解嵌入式数据库的另一大好处,即它们不需要与网络调用进行交互。与标准数据库相比,这是一个巨大的性能提升。本质上,在正常的开发中,您希望将数据库放在它自己的服务器(或服务器集群)上,这样它的资源消耗就不会影响您体系结构中的其他组件,而对于嵌入式数据库,您希望它们尽可能靠近客户端代码尽可能。这减少了它们之间的延迟并避免了对通信通道(即网络)的依赖。现在,这个想法可以有多种形式,从使用JSON文件作为主要存储的快速内存数据库,到可以使用类似SQL的语言查询的高效微型关系数据库。让我们看看5个选项。LowDB让我们从简单开始,LowDB是一个小型的内存数据库。这是一个非常基本的解决方案,但它解决了一个非常简单的用例:需要从基于JavaScript的项目中存储和访问类似JSON的结构(即文档)。LowDB的一个主要好处是它可以从JavaScript中使用,即:它可以在后端、桌面和浏览器代码中使用。在后端,你可以将它与Node.js一起使用,对于桌面开发,它可以集成到一个Electron项目中,最后,它还可以通过其集成的JS运行时直接在浏览器上运行。该数据库提供的API也非常简单和简约,它不提供任何开箱即用的搜索功能。它仅限于将JSON文件的数据加载到数组变量中,让您(用户)以您认为合适的方式找到您要查找的内容。比如看下面的代码:import{LowSync,JSONFileSync}from'lowdb'consttitle="Thisatest"constadapter=newJSONFileSync('file.json')constdb=newLowSync(adapter)db.read()//加载文件内容存入内存db.data||={posts:[]}//默认值db.data.posts.push({title})//添加数据到“集合”db.write()//通过把data保存到json文件,持久化数据//任何类似finding的操作都是用户自己完成letrecord=db.data.posts.find(p=>p.title=="Helloworld")if(!record){console.log("Nodatafound!")}else{console.log("==Recordfound=")console.log(record)}如您所见,这里有趣的部分不是默认行为,但我'm使用名为JSONFileSync的适配器。我可以轻松使用我创建的自定义适配器,这是该数据库的真正优势。它具有高度可扩展性并与TypeScript兼容,TypeScript为数据存储提供类似模式的行为(即不允许添加不遵循预设模式的数据)。如果混合使用这两个选项,那么LowDB将成为处理本地json类数据的有趣选项。LevelDBLevelDB是由Google构建的开源键值数据库。它是一种超快但非常有限的键值存储,其中数据按开箱即用的键顺序存储。它只有三个基本操作:Put、Get和Delete,除此之外别无其他-如果您考虑一下,有点像LowDB。与LowDB一样,它没有客户端-服务器包装器,这意味着无法从任何语言与它通信,如果你想使用它,你必须使用C/C++库,如果你想要一个类似服务器的行为,你必须自己封装它。与我们将在此处介绍的大多数情况一样,函数非常基本,因为它们涵盖了一个非常简单但需要的用例:将数据存储在代码附近并快速访问它。该数据库的存储架构围绕日志结构合并树(LSM)构建,这意味着它针对大型顺序写入操作而非小型随机操作进行了优化。LevelDB的一个主要限制是,一旦打开,它就会在存储上获得系统级锁,这意味着当时只有一个进程可以与数据库交互。当然,你可以使用多线程来并行处理这个过程中的一些操作。但这就是它的范围。有趣的是,这个数据库被用作Chrome的IndexedDB的后端,显然MinecraftBedrockEdition也用它来存储一些块和实体数据(尽管从它的外观来看,他们使用的是Google实现的略微修改版本)。我之前提到过IoT的Raima数据库管理器不是吗?Raima是目前最快的数据库管理器之一,经过优化以在资源受限的物联网设备中运行。资源受限环境是什么意思?Raima只需要350kb的RAM即可运行。这就是我可以做到的极简资源利用。该解决方案的关键特性之一是它对SQL的全面支持,这在以前的任何解决方案中都不存在。它提供关系数据模型,并允许您使用SQL语言进行查询。与LevelDB不同,它还允许通过客户端-服务器架构(即允许您比其他架构更远离源代码的架构)对数据库进行多进程访问。如果您决定使用接近源代码的嵌入式应用程序,您还可以使用多线程来支持对多个数据库的并发访问。Raima的灵活性允许您从传统的客户端-服务器方法转向最高效(当然也是有限的)用例,即由单个客户端使用的单个内存数据库。但是,嘿,这是嵌入式数据库的一个非常有效的用例。这种灵活性使其成为一种非常通用的解决方案。当然,每种部署模型都有其自身的优点和局限性,但也针对特定用例进行了优化。因此,请确保选择正确的数据库并充分利用该数据库。ApacheDerby如果您正在寻找另一个非常小的类似SQL的数据库,那么ApacheDerby可能就是您正在寻找的。Derby完全用JAVA编写,当它声称只有3.5Mb的内存占用时,它也失去了一点可信度。毕竟,如果不在主机系统上安装JVM,您将无法运行或使用它。也就是说,如果您的用例允许使用JVM,那么很好,您可以继续考虑Derby,否则您可能想要使用更原生的解决方案,如LevelDb或Raima。但正如我所说,如果您已经在从事JAVA项目并且需要集成一个小型、可靠、基于SQL的数据库,那么Derby绝对是一个潜在的候选者。它带有一个集成的JDBC驱动程序,因此不需要额外的依赖项。它既可以在JAVA应用程序中以嵌入式模式工作,也可以作为独立服务器工作,允许多个应用程序同时与其交互(类似于Raima的工作方式,但没有很多变体)。老实说,这个项目最大的缺点是它的文档。它可能是JAVA社区中的一个标准,但它对用户来说不是很友好,而且大多数官方链接都会将读者发送到一个私有的confluence页面。这里的许多其他解决方案在文档方面提供了更流畅的体验,这也有助于采用他们的产品。solidDB最后,solidDB提供了一个非常有趣的内存关系数据库,它还增强了持久性模型。声称它可以使两个数据存储选项实时同步。这是一个不小的要求。基本上与此处列出的其他解决方案一样,可以通过ODBC或JDBC访问solidDB,这允许JAVA和C应用程序通过SQL与其交互。也像这里列出的一些解决方案一样,它可以以多种模式部署:高可用性模式。这涉及具有重复数据的多个服务器。当然,这种模式在我们考虑的用例中并不是很常见。共享内存访问。这个方案非常有趣,因为它不仅将数据保存在内存中(就像已经列出的其他解决方案一样),而且还允许多个应用程序访问该内存(因此共享内存部分)。当然,直接访问共享内存需要由同一节点内的应用程序来完成,但是,它也允许基于JDBC/ODBC从外部节点访问相同的数据。将共享内存转变为具有外部访问权限的内存数据库。由于可以快速访问数据,Cisco、Alcatel、Nokia和Siemens等几家大公司都声称将数据库用于关键任务操作。考虑到它的所有部署模式、广泛的文档和高需求的客户列表,我认为这是该列表中最可靠、稳定和快速的嵌入式数据库之一。嵌入式数据库旨在解决非常具体的用例,要么通过提供具有最小延迟的快速可靠的数据存储,要么通过允许快速安全地访问数据。此处列出的解决方案通过不同的方式实现这些目标,由您和您的特定环境来决定哪一种适合您。