.NET Core、PostgreSQL 和文档数据库





5.00/5 (4投票s)
在关系数据库系统中实现 NoSQL 数据库功能
引言
在软件中使用文档很有趣。这意味着存储与您的代码相符,而不是反过来。这消除了您如何建模应用程序以及如何存储这些模型之间存在的对象关系阻抗不匹配问题。
即使您没有立即使用文档的需求,学习如何使用文档也会拓宽您对存储系统的看法。
完成某件事总是有不止一种方法。说到我家里的工作,我最喜欢的是根本不做。我用这种方法处理景观美化、割草、其他家务以及所有我能逃避的事情。[有人曾经说过,你总能认出IT人员的房子——它通常是社区里院子最难看的房子]。
说到数据库,我们有多种方法来处理持久性。两种常见的方法是关系型数据库(RDBMS)和NoSQL(文档)数据库。是的,您猜对了,这篇文章不是关于两者的区别或比较,而是旨在在关系型数据库系统中实现NoSQL持久性。是的,您可以同时拥有两者,它们应该在您的解决方案中发挥各自的作用。我们稍后会看到PostgreSQL(通常是RDBMS)如何让您非常轻松地做到这一点,这将很有趣。
数据库是任何业务应用程序的基础部分。我们使用关系型数据库已经很长时间了,也享受或忍受了它的优缺点。近年来,我们看到了NoSQL(文档)数据库的增长,它们在各种场景中都非常有用。
在这篇文章中,我将首先写一些关于文档的通用内容,然后我将向您展示一个使用.NET Core、PostgreSQL和Entity Framework处理文档的简单实现。
文章结构如下:
- 文档数据库(关于基于文档的数据库的通用讨论)
- 解决方案设置(使用必要的工具设置.NET Core解决方案)
- API实现(Web API控制器实现)
为了让讨论更集中,我省略了一些细节,并提及了必要的资源,如果您想了解更多信息。这篇文章将为您提供一个关于文档持久性理论到实现的良好概念。
什么是文档
您如何思考您存储的文档将对您的整个项目产生重大影响。
请记住:规范化规则不适用于文档存储。所以把您的规范化思维抛诸脑后吧。
文档可以是您想要的任何东西,这种自由带来了选择的常见悖论:选择太多。您如何选择?好吧,让我们把我们的情况缩小到三种思维方式。
- 一个领域模型
- 一个流程结果
- 一个真实的文档
一个领域模型
第一种是像开发人员一样思考。您可以轻松地创建一个文档来表示一个领域模型。这是一种完全可以接受的关于文档的思考方式。
流程结果(或事务或事件源)
另一种思考方式是像信息囤积者或DBA一样。您可以将文档设计为应用程序中许多流程的结果或事件(如果您愿意,也可以是事件源)。
下面所示的示例表示一个结账流程。因此,其前面的一个流程是发货流程
真实文档
第三种思考文档的方式是像一个商人。采购订单、营销单、销售订单和发票。如果您愿意,几乎可以直接在数据库中表示所有这些信息。会有重叠,但在文档系统(document base system)中,重叠是可以接受的。
方法
我们不必局限于上述三种中的任何一种,我们可以同时做这三种。
包含所有流程结果的大文档。也可以被认为是事件源。
使用 .NET Core 在 PostgreSQL 中持久化文档
现在我们对文档有了一些了解,让我们看看如何在代码中实现它。我之前写过关于 PostgreSQL 的文章,如果您喜欢,可以参考那篇文章。它是一个关系型数据库系统,但它也支持使用其数据类型 json/jsonb 进行文档持久化。
PostgreSQL 文档中定义的json和jsonb数据类型几乎相同;主要区别在于 json 数据存储为 JSON 输入文本的精确副本,而 jsonb 将数据存储为分解的二进制形式;也就是说,不是作为 ASCII/UTF-8 字符串,而是作为二进制代码。
我将使用 .NET Core (WebAPI) 来实现一个简单的 API 以与 PostgreSQL 交互。我还会使用 Entity Framework 进行数据库查询,但是,我不会讨论解决方案如何设置的细节,如果您需要有关这些主题的更多信息,可以在互联网上搜索,或者您也可以查看我的书,其中详细介绍了这些问题。
好的,我们开始吧。
解决方案设置
我创建了一个典型的 .NET Core 解决方案,其中包含一个 WebAPI 项目。我还添加了两个 .NET Standard 库项目,以便为 核心 领域模型和 数据库 层提供独立的层。同样,有关分步细节,请查看我之前提到的书。
为了使用 PostgreSQL,我添加了 Entity Framework 和 PostgreSQL 相关的 NuGet 包。下图显示了安装了包的解决方案设置。
此设置非常基本,我已在前面提到的书中逐步描述过。
领域设置
回想一下前面的讨论,领域模型(检查 Core 项目)是建模文档的一种方式,反之亦然。下图显示了一个非常简单的领域模型,它不言自明,我们将把它持久化到 PostgreSQL 中
EntityFramework 设置
现在,我们有了领域模型,我们将按如下方式设置实体框架(检查数据项目)映射
依赖注入设置
在 Web 项目中,我设置了 PostgreSQL 的 DI,如下所示。我还在 appsettings.json 文件中定义了 连接字符串。
创建和应用迁移
一旦我们设置好所有必要的连接,我们就可以运行实体框架迁移工作流来创建我们的数据库/表。
以下是相应的迁移创建(请注意 jsonb 数据类型)
审核后,我们可以按如下方式应用迁移
.NET Core WebAPI(CRUD 功能)
我创建了一个 API 控制器来公开对文档的各种操作。让我们看看这些是如何实现的。我尝试使实现非常简单,但请随意根据需要调整代码。客户端代码也是如此,您可以使用 Angular、React 或任何技术构建应用程序,我将使用 POSTMAN 进行 REST 调用。
创建(发布)文档
这是方法的实现,它是一个典型的 POST
请求,我们通过 dbcontext 持久化它
读取(获取)文档
这是从数据库读取文档的代码和 PostMan 请求块
删除文档
以下代码显示了 Delete
请求的实现
LINQ 查询获取汇总信息
以下查询显示了摘要数据的实现。您也可以执行其他 LINQ 查询,请参阅文档了解更多详细信息
摘要
使用文档简化了许多编码任务。PostgreSQL 是其中一种选择。还有许多其他 NoSQL(文档)数据库可用,例如 MangoDb、RethinkDb,并且文档导向数据库的概念是相同的。
.NET Core 和 EntityFramework 支持并简化了 PostgreSQL 的入门,但您也可以使用 Node 或其他技术实现相同的功能。您可以从此 Git 仓库下载源代码。下次再见,祝您编码愉快。
其他链接
- https://hexquote.com/postgresql/
- https://www.npgsql.org/efcore/mapping/json.html?tabs=data-annotations%2Cpoco
- https://github.com/jawadhasan/pgjsondemo
历史
- 2020年10月18日:初始版本