dot Redis 8 已发布,且是开源的

了解更多

使用 Redis 进行 NoSQL 数据建模

Redis 中的 8 种数据建模模式” 是一本关于 NoSQL 数据建模的综合性电子书,深入探讨了开发人员可以在 Redis 中利用的八种数据模型,以便构建现代应用程序,而无需面对传统关系型数据库带来的障碍。以下是书中部分内容的预览。

下载 “Redis 中的 8 种数据建模模式

NoSQL 数据库设计

与关系型数据库不同,您不必在开始时就确定模式设计。这就是 NoSQL 成为许多开发人员明智选择的原因。在 SQL 中,您的数据必须符合数据模型,这可能导致数据丢失。在无模式设计中,您的数据保持不变,并且在需要时始终可访问。

NoSQL 数据建模技术

在关系型数据库(SQL 数据库)中建模数据时,开发人员通常需要从一开始就预测应用程序的未来。可能的功能有哪些?如何设计数据模型,使其足够灵活以适应业务可能需要的任何变化?

关系型数据库缺乏灵活性。它们需要大量的预先知识,并且使得在不同模型中存储大量数据变得相当困难。从将数据传输到表或集合,以及需要复杂的查询来分散数据,传统的 SQL 数据建模方式在构建现代企业应用程序所需的所有细微之处面前正逐渐失去其受欢迎程度。 

以下是开发人员在Redis 和 NoSQL 中使用的八种主要数据建模技术。

嵌入模式

嵌入模式允许将两个单独的表或集合捆绑在一起,其中一个表嵌入到另一个表中。嵌入模式是将包含相互关联信息的不同表(例如产品名称表和产品详细信息表)放在同一位置的优秀模型。这使得查找所有相关数据并理解它们在数据结构中的相互关系变得更加容易。它还有助于您的应用程序通过一个查询检索两个表中的数据,从而提高其整体读取性能。

一对一关系

正如您在关系型数据库中会发现的那样,上述描述说明了如何使用一对一数据模型。

假设您正在为一家服装零售商构建产品目录。第一个表可以包含产品 ID 号、名称、图片和价格,而另一个表存储尺寸、规格等。 

那么,为什么看似密不可分的数据要分成两个表?为什么不只用一个表来存储数据呢?主要是因为在应用程序中,每个表都作为自己的视图。当显示产品列表时,您可能只需要显示名称、图片和价格。单个产品的详细视图会显示其余字段。在 SQL 中,最简单的方法是使用两个表,这样更容易只查询您需要的特定字段。在 NoSQL 中,您只需要一个集合,因为您可以将详细信息嵌套在“details”字段中,并且在不需要时不会检索它。

快速了解 Redis 中的一对一关系模型

https://www.youtube.com/embed/c9Rr--1r6pk

部分嵌入模式

一对多关系

首先值得注意的是,一对多和多对多关系都使用了嵌入模式和部分嵌入模式。

当您想建模一对多关系时,对于有界列表(即已知大小的列表)进行嵌入,而对于无界列表则保持单独的集合。 

在构建包含产品的应用程序时,您通常需要在应用程序中提供真实的产品反馈,以建立客户的信任。在这种情况下,产品是“一”,而包含作者姓名、发布日期、评分和评论的众多评论则是问题中的“多”变量。 

导入 Redis OM 库并开始建模时查看其运作方式

https://www.youtube.com/embed/xauum_DKliw

多对多关系

模式 1:具有有界边的多对多关系

SQL 需要您创建一个单独的表来存储两个表数据集之间的关系,而在 NoSQL 中,您可以创建所谓的双向嵌入。 

下面的视频提供了一个讲师/课程示例来演示此模型的工作原理,其中一个表用于讲师,另一个表用于课程。 NoSQL 通过在课程 JSON 文档中嵌入讲师键列表并在讲师 JSON 文档中嵌入课程键列表来简化关系型数据库解决方案。 

有界边意味着数据集中的数据点数量有限制。我们知道教授或课程的数量并非无限。有界仅表示它不是无限的。

模式 2:具有无界边的多对多关系

在 SQL 中,多对多关系的无界边可以形成一个讲师表和另一个学生表,在这个例子中,注册人数可能是无限的。在非关系型数据库中,您要做的是将列表嵌入到有界边。 

因此,如果两边都有界,可以在两边都嵌入,但如果只有一边有界,那将是您应该嵌入列表的集合。

RedisInsight 中查看多对多关系是什么样子

https://www.youtube.com/embed/YVrQ8JL1-xA

聚合模式

在构建读密集型应用程序时,考虑使用聚合模式来减少在读取时动态计算聚合信息所产生的开销。此模式也称为计算模式,它在写入时而不是读取时预先计算某些字段,从而节省了服务器和数据库的读取时间开销。

观看我们如何使用聚合模式进行建模,在 Redis Stack 中导入 Redis OM for Node.js

https://www.youtube.com/embed/MZWzxRMOpps

多态模式

在关系型数据库中,您需要单独的表来存储您正在处理的不同类型产品的具体信息。要获取所有产品,所有包含各自具体信息的表都必须连接在一起,这会产生严重的开销。

在构建数据模型时,多态模式允许您将许多不同类型的产品及其独特字段都存储在同一个集合中。

使用 Redis Stack,所有模式都具有灵活性,并允许您区分将集合分组在一起的类型字段。开始使用 Redis Stack 的多态模式减少用于存储数据的集合数量,并简化查询中的应用程序逻辑。

https://www.youtube.com/embed/oBBC1hLpWE0

分桶模式

在构建读密集型应用程序时,考虑使用分桶模式来减少随着数据的流入存储和聚合时间序列数据所产生的读取开销。随着数据的滴入存储每一位数据会给您的系统带来额外负担。相反,分桶模式有助于——您猜对了——根据特定的时间跨度对您的时间序列数据进行“分桶”,从而降低处理时间。 

观看我们如何使用 Node.js 和 Redis Stack 的内置时间序列功能演示分桶模式

https://www.youtube.com/embed/5m4YgClPKCg

修订模式

您如何跟踪您正在进行的文档更改?这就是修订模式的应用之处。 

您很可能在专业工作中使用过 Google Docs。想象一下,您想发布关于您和团队刚刚开发出的最新产品的帖子。实时文档显示了包含最新修订的帖子当前状态,但所有过去贡献者的所有其他修订都仍然存储并可在需要时访问。这是修订模式工作原理的完美示例。使用它,您可以将您对帖子进行的所有修订以及帖子本身存储在一个文档中,从而简化您的查询并完善您的模式。

从法律行业到金融服务医疗保健、出版和保险行业,修订模式可在许多依赖实时数据的用例中加以利用。 

查看我们如何在 Redis OM for Python 中使用修订模式进行建模

https://www.youtube.com/embed/AtPcQ-jpP6M

树和图模式

通常,您想避免在非关系型数据库中使用 JOIN 操作。树和图模式在您的模式中不可避免 JOIN 操作时特别有用,并且您正在处理诸如人力资源系统、CMS、产品目录和社交网络等基于 JOIN 的繁重操作时。

树模式对于关系模型来说并不陌生——您会经常看到像组织结构图或谱系图那样的树模式。在 NoSQL 中,您可以利用这些模式来解决 JOIN 操作的复杂性,而无需复杂的 SQL 查询。 

观看我们如何在 Redis Stack 中使用树和图模式建模组织结构图

https://www.youtube.com/embed/GbnHKjLMK2g

模式版本模式

改变数据模型和升级数据的一个有用协议是模式版本模式。使用 SQL 数据库构建应用程序时,一旦开始构建模式,就很难对模型和应用程序逻辑进行任何更改。在 NoSQL 中,您可以利用此模型(在 Redis Stack 中尝试 Node.js)更轻松地进行调整。

建议您始终为文档分配版本,以便将来可以更改它们,而无需担心立即迁移所有数据和代码。模式版本模式是一种为数据模型分配版本的方式,通常在文档级别完成。您也可以选择将所有数据作为 API 的一部分进行版本控制。  

您可以将模式版本模式应用于现有代码。查看 Redis Stack 如何实现这一点

https://www.youtube.com/embed/g--XWSwuazk

常见问题

什么是 NoSQL 数据模型?

它是一种不受关系型数据库管理系统(RDBMS)支持的模型。因此,该模型并未明确说明数据之间的关系——它们如何连接在一起。

数据如何存储在 NoSQL 中?

在主要的非关系型数据库模型之一中,例如键值存储、文档存储、图数据模型、时间序列存储、列族存储。数据可以存储在磁盘、内存中,或两者兼而有之。

NoSQL 有模式吗?

是的,它有。当人们说 NoSQL 是“无模式”时,他们实际上是指模式是灵活的,并随着时间的推移由开发人员和应用程序的需求决定。  最终会确定一个模式——它不像 SQL 数据库那样在开始时就存在。

您可以将 Redis 用作 NoSQL 数据库吗?

是的,您可以将 Redis Enterprise 用作 NoSQL、内存中、多模型数据库。

有复杂的 NoSQL 示例吗?

许多公司正在为各种用例和不同复杂程度使用 NoSQL。Redis Launchpad 有几个使用 Redis 和 NoSQL 编写的应用程序示例。

为什么大数据倾向于使用 NoSQL 数据库?

使用大数据时,您通常会聚合来自许多不同来源的大量形状未知的数据。这需要 NoSQL 数据库提供的灵活模式、速度和可伸缩性。

为什么我们不能将机器学习与 NoSQL 结合使用?

这可能曾经是事实,但目前并非如此。