公告推出MongoDB 8.0,有史以来最快的MongoDB! 阅读更多 >>推出MongoDB 8.0,有史以来最快的MongoDB! >>

什么是键值数据库?

键值数据库,也称为键值存储,是一种NoSQL数据库类型,其中数据以键值对的形式存储,并针对读取和写入该数据进行了优化。数据可以通过一个唯一键或多个唯一键来检索与每个键关联的值。值可以是简单的数据类型,如字符串和数字,也可以是复杂对象。

唯一键可以是任何东西。大多数情况下,它是一个id字段,因为这是所有文档中的唯一字段。为了分组相关项目,您还可以将公共前缀添加到键中。键值对的一般结构是key: value。例如,“name”: “John Drake”。


目录

Key value database storage

多年来,数据库系统已经从存储在行和列中的传统关系数据库发展到允许针对每个用例提供解决方案的分布式数据库。键值对存储不是一个新概念,在上个几十年里就已经存在。其中一个已知的存储是旧的Microsoft Windows注册表,它允许系统/应用程序以“键值”结构存储数据,其中键可以表示为唯一标识符或指向值的唯一路径。

数据根据键写入(插入、更新和删除)和查询以存储/检索其值。

键值数据库的类型

键值数据库针对性能进行了优化,并且根据用例的不同,存在不同类型的键值数据库。例如,如果您使用键值数据库的目的是缓存,则可以使用内存中的键值存储。如果您正在寻找持久存储(磁盘),则可以使用持久键值数据库。还有支持多个数据模型(如文档、图和键值)的多模型键值数据库,从而提供灵活性。流行的键值数据库示例包括

  • 内存键值数据库:MongoDB。
  • 持久键值数据库:MongoDB。
  • 多模型键值数据库:MongoDB。

键值数据库是如何工作的?

键值数据库,也称为键值存储,将一个值(可以是数字、简单字符串到复杂对象等任何东西)与一个唯一标识符(键)相关联,该键用于跟踪对象。在其最简单形式中,键值存储类似于在大多数编程范式存在的字典/数组/映射对象,但它由数据库管理系统(DBMS)管理。

键值数据库执行三种主要操作

  • put(key, value):将值插入或更新到数据库中。
  • get(key):从数据库中读取值。
  • delete(key):从数据库中删除值。

CRUD operations in key value databases


键值数据库模式

与关系型数据库不同,键值数据存储不遵循特定的模式,这使得它们具有灵活性。这使得它们成为无结构和半结构化数据的良好选择。与关系型数据库表结构相比,在键值存储中存储和检索数据变得更加简单。在下面的图像中,由于JSON结构,所有数据都被分组在一起。您可以将从简单类型到复杂类型的数据作为值存储。在检索数据时,您可以通过迭代JSON数据来检索单个记录。

Relational database storage vs key value database storage.

在键值存储中分组类似项

通常,您可以将一个项目作为单独的键值对存储。然而,对于存储复杂的对象,如客户,您将希望存储所有相关的详细信息,如客户姓名和电子邮件地址,作为相关数据。您可以通过为键使用一致的命名约定(如前缀)来分组相关项。例如,我们可以有键“customer:1”、“customer:2”等等。要读取此类相关数据,您可以迭代具有共同前缀的键。

键值数据库使用紧凑、高效的索引结构,能够快速、可靠地通过键定位值,这使得它们非常适合需要能够以恒定时间找到和检索数据的应用程序。

如MongoDB这样的文档数据库不仅支持快速检索,即使数据类型复杂,也提供了更多高级查询功能。MongoDB在数据类型简单时可以像键值存储数据库一样工作,而当涉及更复杂的数据类型或嵌套结构时,则作为完全成熟的文档数据库。

Redis是一个针对跟踪相对简单数据结构(原始类型、列表、堆和映射)在持久数据库中进行了优化的键值数据库。通过只支持有限数量的值类型,Redis能够提供一个极其简单的查询和操作它们的接口,并且当配置得当,能够实现高吞吐量。

键值数据库的特点

键值数据库的定义是允许程序或程序的用户通过键检索数据,键实际上是名称或标识符,指向某个存储的值。由于键值数据库的定义非常简单,因此可以更快地获取准确的信息。以下是键值数据库的一些重要特性


灵活的数据模型

键值数据库没有固定的模式或表结构。因此,当数据演变时,很容易将键值存储从一个系统移动到另一个系统,而无需更改架构或设计。灵活的数据结构还确保了速度和可伸缩性。


没有查询语言

由于没有固定结构,键值数据库不需要查询语言来进行CRUD操作。您只需提供键作为输入,即可获取值作为输出。一些键值数据库支持高级查询功能——例如,检索一组相关项目、聚合、文本搜索和部分字段检索。


支持复杂数据类型

除了简单的字符串或数字类型外,键值数据库还可以支持数组、JSON、日期、媒体文件(二进制数据)和嵌套结构等数据类型。


索引支持性能

高级键值数据库除了支持主索引外,还支持各种类型的索引,例如二级索引、哈希索引、基于树的索引和通配符索引,以提高数据检索的性能和效率。

何时使用键值存储

在以下几种情况下,选择键值存储方法是一种最优解决方案

  • 实时随机数据访问,例如在线游戏或金融应用程序中的用户会话属性

  • 基于键的频繁访问数据或配置的缓存机制

  • 应用程序是基于简单的键查询设计的

MongoDB作为键值存储

虽然MongoDB主要是一个文档数据库,但它确实涵盖了广泛的数据库示例应用场景,支持键值对数据概念。凭借其灵活的模式和丰富的查询语言以及二级索引,MongoDB是“键值”数据的诱人存储。

在本文中了解更多信息,并使用MongoDB Atlas(MongoDB的数据库即服务平台)进行尝试。

MongoDB将数据存储在集合中,集合是一组BSON(二进制JSON)文档的集合,每个文档基本上是由字段值结构构建的。MongoDB高效存储灵活模式文档并对任何附加字段进行索引的能力,使其成为一个诱人的键值存储

{
    session_id : "ueyrt-jshdt-6783-utyrts",
    create_time : 1122384666000
}

此外,MongoDB的文档值允许嵌套键值结构,不仅允许在全局意义上通过键访问数据,还可以访问和操作与键相关的数据,甚至创建允许通过这些二级键快速检索的索引。

{
    name: "John",
      age : 35,
      dob : ISODate("01-05-1990"),
      profile_pic : "https://example.com/john.jpg",
      social : {
                 twitter : "@mongojohn",
                 linkedin : "https://linkedin.com/abcd_mongojohn"
               }
}

MongoDB的本地驱动程序支持Python、C#、C++和Node.js等多种常用语言,允许您使用您选择的语言存储键值数据。


支持键值的二级索引

每个字段都可以根据您的查询模式进行索引。例如,如果我们根据特定的会话id(作为键)和创建时间(作为值)进行搜索,我们可以对db.sessions.createIndex({session_id : 1})进行索引并查询该键

db.sessions.find({session_id : "ueyrt-jshdt-6783-utyrts" },{create_time : 1}).create_time;

支持键值的通配符索引

通配符索引允许用户索引MongoDB集合中的每个字段或字段子集。因此,如果我们有一组存储在单个文档中的字段值类型,并且查询可以针对每个标识符动态进行,我们可以为这些字段值集创建单个索引。

db.profiles.createIndex({"$**" : 1 });

因此,我们的查询将得到这个索引支持的每个字段值查询的全支持。话虽如此,通配符索引仅在无法预先预测字段名称且查询谓词的多样性需要这样做的情况下使用。有关更多信息,请参阅通配符限制


支持键值的模式设计

由于MongoDB文档可以是复杂对象,因此应用程序可以使用模式设计来最小化索引足迹并优化“键值”方法的访问。这种设计模式被称为属性模式,它利用文档数组来存储“键值”结构。

attributes: [
        {
        key: "USA",
        value: ISODate("1977-05-20T01:00:00+01:00")
        },
        {
        key: "France",
        value: ISODate("1977-10-19T01:00:00+01:00")
        },
        {
        key: "Italy",
        value: ISODate("1977-10-20T01:00:00+01:00")
        },
        {
        key: "UK",
        value: ISODate("1977-12-27T01:00:00+01:00")
        },
        ... 
    ]

索引 {attributes.key : 1 , attributes.value : 1} 将允许我们通过一个索引来搜索任何键。

键值数据库与缓存对比

支持键值存储的数据库将数据持久化到磁盘上,磁盘服务于数据库文件,而键值缓存实现将数据主要加载到内存中。[链接](https://mongodb.ac.cn/databases/in-memory-database)。在服务器故障或重启的情况下,由于数据没有持久化,需要预先将数据加载到缓存中。

MongoDB使用其WiredTiger引擎的缓存来优化数据访问和读取性能,同时确保副本集之间的一致性和高可用性。这允许在保持最佳缓存数据性能的同时,提供更健壮和可用的字段值存储。

键值数据库的优势

键值方法允许定义高效且紧凑的数据结构,以键值形式简单地进行数据访问、更新和删除。

MongoDB文档可以形成紧凑灵活的结构,以支持对键值存储进行快速索引。另一方面,MongoDB文档可能包含复杂的对象,可以包含整个层次结构和子值,并且复杂的索引允许通过任意数量的不同键来检索文档。

总结

键值存储用于那些需要通过键快速检索值的用例,例如编程语言中的映射或字典。这种紧凑的结构和通过这些索引的简单索引和搜索使这种数据库概念适用于特定的应用程序工作负载。

然而,现代应用程序可能需要的不仅仅是键值检索,这正是MongoDB和MongoDB Atlas提供最佳解决方案的地方。MongoDB可以在支持字段值存储的同时,允许形成复杂对象,并提供了多种查询数据的方式:[全文搜索](https://mongodb.ac.cn/atlas/search)、[聚合框架](https://docs.mongodb.com/manual/aggregation)、[Atlas数据分层](https://mongodb.ac.cn/atlas/online-archive)或[跨多个分片进行扩展](https://mongodb.ac.cn/basics/scaling)。

常见问题解答

什么是键值数据库?

键值数据库是一种NoSQL数据库,以键值对的形式存储数据,例如,“name”: “John Drake”。在这里,name是唯一键,用于标识对象,而John Drake是与它关联的值。

何时会使用键值数据库?

键值数据库有几种用例,例如会话管理、缓存、管理配置设置、实时数据分析以及存储用户偏好和配置文件信息。

MongoDB是键值数据库吗?

MongoDB是一种文档数据库,由于数据存储的方式,可以用作键值数据库。MongoDB以键值格式存储JSON文档,这使得模型灵活且易于检索。

键值数据库与文档数据库有什么区别?

在键值数据库中,数据以简单的键值对形式存储。可以存储字符串、数字、二进制大对象(blobs)和数组等数据类型。文档数据库更灵活,可以存储嵌套数据,并且以相同的键值格式(通常是JSON或BSON结构)存储。文档数据库还提供高级查询功能,这在键值数据存储中是不可能的。键值数据库适合快速简单地进行数据检索。