介绍
用软件处理文档很有趣。这意味着存储适合您的代码,而不是相反。这样可以消除应用程序建模与模型存储之间的对象关系阻抗不匹配。
即使您没有立即使用文档,学习如何使用文档也将拓宽存储系统的视野。
总是有不止一种方法来完成某件事。当要在我家附近工作时,我最喜欢的一点是根本不做。我采用这种方法来美化环境、割草,做其他家务活以及我可以摆脱的其他一切。[有人曾经说过,您总是可以告诉房子,那是IT人员拥有的房子——它通常在附近的院子里看起来最糟]。
对于数据库,我们有多种使用持久性的方法。两种常见的方法是关系数据库(RDBMS),另一种是NoSQL(文档)数据库。是的,您猜对了,这篇文章不是关于两者之间的差异或比较,而是旨在在关系数据库系统中实现NoSQL持久性。是的,您可以同时拥有它们,它们应该在您的解决方案中达到目的。稍后我们将看到PostgreSQL(通常是RDBMS)如何使您非常轻松地完成此操作,这将很有趣。
数据库是任何业务应用程序的基本组成部分。我们已经使用关系数据库很长时间了,并且也享受或遭受过它的优缺点。近年来,我们已经看到NoSQL(文档)数据库的增长,并且它们在各种情况下都非常有用。
在本文中,我将大致介绍文档,然后向您展示使用.NET Core,PostgreSQL和Entity Framework处理文档的简单实现。
该文章的结构分为以下几节:
- 文档数据库(有关基于文档的数据库的一般讨论)
- 解决方案设置(使用必要的工具设置.NET Core解决方案)
- API实现(Web API控制器实现)
为了使讨论更加集中,我跳过了一些详细信息,并提到了必要的资源(如果您想查看更多信息)。该文章将使您对实现文档持久性的理论有一个很好的了解。
什么是文档您如何看待存储的文档将对整个项目产生重大影响。
请记住:规范化规则不适用于文档存储。因此,将您的归一化思维抛到窗外。
文档可以随心所欲,自由带来了一个非常普遍的选择悖论:太多选择。您如何选择?好吧,让我们将案例范围缩小为三种思维方式。
- 领域模型
- 处理结果
- 真实文件
首先是像开发人员一样思考。您可以轻松地制作文档来表示域模型。这是考虑文档的一种完全可以接受的方式。
另一种思考方式就像信息贮藏者或DBA。您可以将文档设计为应用程序中多个过程或事件(如果可以的话,为事件源)的结果。
下面显示的示例代表结帐过程。因此,一个领先的过程是运输过程:
考虑文档的第三种方式就像是业务人员。采购订单、营销表、销售订单和发票。如果愿意,您几乎可以直接在数据库中表示所有这些信息。会有重叠,但是在文档库系统中重叠是可以的。
我们不必将自己限制在以上三个中的任何一个上,我们可以做所有三个。
包含流程所有结果的大文件。也可以认为是事件源。
使用.NET Core在PostgreSQL中保留文档现在,我们对文档有了一些了解,让我们看看如何在代码中实现它。我以前写过有关PostgreSQL的文章,如果愿意,可以参考该文章。这是一个关系数据库系统,但它也使用其数据类型json/jsonb支持文档持久性。
PostgreSQL文档中定义的数据类型json和jsonb几乎完全相同。关键区别在于json数据存储为JSON输入文本的精确副本,而jsonb以分解的二进制形式存储数据;也就是说,不是作为ASCII / UTF-8字符串,而是作为二进制代码。
我将使用.NET Core(WebAPI)来实现与PostgreSQL交互的简单API。我也将采用实体框架数据库查询,但是我不会讨论有关解决方案是如何设置的详细信息,如果您需要有关这些主题的更多信息,你可以在互联网上搜索。
好的,让我们开始吧。
解决方案设置我使用WebAPI项目创建了一个典型的.NET Core解决方案。我还添加了两个.NET标准库项目,分别为Core领域模型和数据库层提供了单独的层。同样,有关分步详细信息,请查阅前面提到的我的书。
为了使用postgreSQL,我添加了实体框架和与postgreSQL相关的nuget包。下图显示了已安装软件包的解决方案设置。
这个设置非常基础,我在前面提到的书中逐步介绍了它 。
领域设置请记住,从前面的讨论中可以知道,领域模型(检查Core Project)是对文档建模的一种方法,反之亦然。下图显示了一个非常简单的领域模型,该模型很容易解释,我们将其持久化到postgreSQL:
现在,我们有了领域模型,我们将如下设置实体框架(检查数据项目)映射:
在Web Project中,我为postgreSQL设置了DI,如下所示。我还在appsettings.json文件中定义了连接字符串。
一旦完成所有必要的布线设置,便可以运行实体框架迁移工作流来创建数据库/表。
以下是创建的相应迁移(请注意jsonb数据类型):
审核后,我们可以按以下方式应用迁移:
我创建了一个API控制器来公开文档上的各种操作。让我们看看它们是如何实现的。我试图使实现非常简单,但是可以根据需要随意调整代码。客户端代码也是如此,您可以使用Angular、React或任何技术构建应用程序,我将使用POSTMAN进行REST调用。
创建(Post)文档这是方法的实现,这是一个典型的POST请求,我们通过dbcontext对其进行持久化:
这是用于从数据库读取文档的代码和PostMan请求块:
以下代码显示了Delete Request的实现:
以下查询显示摘要数据的实现。您也可以执行其他LINQ查询,请参考文档以获取更多详细信息:
使用文档可以简化许多编码任务。PostgreSQL是一种选择。还有许多其他NoSQL(文档)数据库可用,例如MangoDb,RethinkDb和面向文档的数据库的概念是相同的。
.NET Core和EntityFramework支持并简化PostgreSQL入门,但是您可以对Node或其他技术进行相同的操作。您可以从这个git repo下载源代码。
其他连结- https://hexquote.com/postgresql/
- https://www.npgsql.org/efcore/mapping/json.html?tabs=data-annotations%2Cpoco
- https://github.com/jawadhasan/pgjsondemo