RavenDB 文档建模
喵叔哟
Dedicated to promoting and advancing .NET in China for a lifetime.
展开
-
RavenDB数据建模--总结
在本专题中我们首先将 RavenDB 视为一个简单的键/值存储。只需将数据存储进去并通过键访问数据即可。同时我们还学习了使用过期功能来存储与时间相关的数据。从键/值存储的简单模型开始,我们开始考虑真实的文档模型,学习了如何构建嵌入值来存储本质上是文档一部分的数据,还研学习了如何对关系和集合、多对一和多对多关联进行建模。然后,我们介绍了更高级的建模技术,例如如何处理引用和配置数据,以及如何处理时态信息和分层结构。接下来,我们讨论了建模时必须考虑的一些约束,例如如何处理文档的增长以及RavenDB中文档的良好原创 2022-05-21 22:53:18 · 363 阅读 · 0 评论 -
RavenDB建模--ACID模式和BASE模式
本专题最后一节,我们将学习 RavenDB 中常用的两种模式:ACID和BASE模式。首先我先来简述一下什么是 ACID和BASE。ACID 是数据库事务正确执行的四个基本要素的缩写。指 DBMS 在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。BASE 是为了解决解数据库强一致性引起的问题而引发的可用性降低而提出的解决方案。BA指的是基本可用(Basi原创 2022-05-09 02:29:20 · 585 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--过期时间
在 RavenDB 中存储文档时,我们可以指定文档的过期时间,RavenDB 会定期删除所有过期的文档。这个功能虽然很小,但是我们可以利用这个可以实现类似“30分钟有效的验证码”的功能。这里需要主义的是如果你指定了过期时间,则在该时间过后,文档可能依然存在,这是因为 RavenDB 还没有开始清理过期的文档,默认情况下,RavenDB 将每分钟清除过期的文档。因此,文档的生存时间可能比预期的要长一些,但并不是很严重。TIP:我将在后续的专题中具体讲解这个功能。...原创 2022-05-07 00:53:52 · 236 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--修订和审计
我们存在数据库里的数据会随着时间的变化而变化,如果要随时追踪数据的变化是一项极具挑战的任务,但是RavenDB 为我们提供了修订功能来解决这一问题。DBA 可以配置 RavenDB 用来追踪文档的修订,每次文档修改时都会创建一个不可变的修订版本,这样我们就可以通过使用这些修订版本来追踪文档发生的所有变化。但是在实际开发中我们一般不会要求追踪所有文档的变化,这时我们就可以指定 RavenDB 仅跟踪特定的集合,甚至可以跟踪最近的几个修订版本。当然修订也可以用于删除,所以我们可以根据修订版本来回复被删除的文档。原创 2022-05-03 21:31:51 · 347 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--附件与二进制
RavenDB 是一个 JSON数据库,但并非所有数据都可以使用JSON来存储,例如订单中的发票PDF、QQ/微信头像等,对于这种类型的数据它既是文档的一部分又是和文档分开的,因此 RavenDB 会将这类数据作为附件存储。什么是附件?附件是可以附加到文档的二进制数据,附件始终位于文档中,除了存储二进制数据外,还会存储一个附件名称。虽然附件和文档分别位于不同的卫视,但是都保存在同一个存储中,并且附件和文档可以一起处理。这也就是说附件可以和具有相同语义的文档一起参与相同的事务TIP:附件没有大小限制,并且原创 2022-05-01 23:22:05 · 228 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--文档的引用处理、包含以及加载
这篇文章比较简单,在这个专题的一开始,我们探究了对象和文档之间的关系,我们只是专注于构建模型,忽略了跳过我们如何在图表阶段之外处理关系。那么这一小篇文章我们就来简单的说一下这个问题。我们需要考虑两个单独的操作。在查询和加载文档期间获取相关信息可以使用Include调用来完成,这时一个非常常用的功能,因为他可以减少请求服务端的次数。第二个操作是查询,也就是说当想根据相关文档的属性查询特定文档。例如前面文章所说的幼儿园的例子,查询母亲叫刘妈妈的孩子,由于子文档不再包含父级文档的名称,那么我们将如何搜索它呢?R原创 2022-04-23 23:46:30 · 392 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--缓存
RavenDB 使用基于 HTTP 的 REST 用于客户端和服务端的通信,也就是说我们在操作文档的时候其实就是使用 WEB 发送 HTTP 请求,那么基于这一点 RavenDB 就可以利用 HTTP 的特性来执行一些东西。其中最常见的是 RavenDB 客户端 API 使用 HTTP 特性在客户端开启缓存。每个从服务端返回的响应都包含一个 etag 头内容,如果我们只是请求的单个文档,那么这个 etag 头内容就是文档的 etag 标题,如果我们请求的是多个文档的话,这个 etag 头内容就会包含一个计原创 2022-04-17 16:29:33 · 327 阅读 · 0 评论 -
RavenDB文档建模--琐碎的注意事项--并发控制
RavenDB 每秒能处理数十万的请求,这是因为它本质上是并发的。那么这就引出了并发问题,如果有多个请求同一时间同时修改同一个文档,就会出现最后一个被执行的请求将会获胜,它的修改内容将被保留在文档中。在 RavenDB 中 last write wins 模型是默认选项,这个模型出现在对文档的修改和删除的情况下,在创建文档时是不会执行这个模型规则的,因为 RavenDB 它知道请求是要创建一个新文档,并会设置预期的更改向量。TIP:什么是更改向量?这个概念在 RavenDB 被深入的使用,它由节点 I原创 2022-04-17 01:30:13 · 300 阅读 · 1 评论 -
RavenDB文档建模--琐碎的注意事项--缓存查询属性
缓存查询属性是我们在实际开发中会遇到的,什么是缓存查询属性呢?举个例子来说,在电子商城的订单系统中每个账户都有自己的订单数据,有时用户需要查看自己截止到目前所订单的数量,那么这个账户的订单数量可以被视为 查询属性,因为从众多的订单中统计出某个账户的订单数量是一件会消耗很多资源的命令,因此会将这个订单数量存储在缓存中(例如存储在RavenDB中),在后续查询中我们不需要再次从数据库中查询,只需要在缓存冲查询即可,这就叫做 缓存查询属性。缓存查询属性的行为开起来很常见也很有意义,但是着是一个不良的行为。为什么原创 2022-04-04 18:22:05 · 840 阅读 · 0 评论 -
RavenDB 文档建模--琐碎的注意事项--处理无限增长的文档
使用 RavenDB 进行数据建模的一个重大挑战是数据不同的特征和行为会对各种操作成本产生不同的影响,这又反过来影响我们设计和使用模型的方式。从这篇文章开始我将通过4到6篇文章来讲解 RavenDB 文档建模琐碎的注意事项。处理无限增长的文档多大的文档才能被成为大文档?多小的文档才能被称为小文档?不同的 NoSQL 数据库给出的答案是不一样的,但是一般来说良好的文档大小范围应该在千字节左右。在 RavenDB 对文档的大小限制是有硬性规定的,不超过2GB,不要觉得着2GB不够用,RavenDB会对 JS原创 2022-04-04 17:12:48 · 475 阅读 · 0 评论 -
RavenDB 文档建模--RavenDB 高级建模方案
上篇文章讲解了标准业务数据的建模方案,但是在实际项目中还存在非标准方案来解决大量复杂的数据结构,那么本篇文章就来讲讲。Reference dataReference data 在项目中很常见,比如省市列表、税率列表等,这些都可以作为 Reference data 存储在库中。它的特点就是小(占用空间小,变动小),而且独立存在(它的改变不会几乎很少影响到其他文档)。比如以省市列表为例,我们可以为每个省市信息定义一个文档,Id 就是省市简称,Name 值为省市全名,这种方式看起来很好,但是并不是最好的办法。原创 2022-03-22 00:15:27 · 287 阅读 · 1 评论 -
RavenDB建模--常见建模方案
在 RavenDB 中对如何在应用程序中进行数据建模没有任何要求,我们可以使用任何形式进行建模,RavenDB 只关心如何构建数据,这就是我们后续几篇文章要讲解的内容。TIP:在本专题后续文章中我们讨论的是具体的方案,而不是通用方案。为了方便讲解以及读者可以听得懂,我将使用幼儿园作为数据模型,它包含 Child、Parent以及Registration 这三个概念,实体类如下:public class Parent { public string Name { get; set;原创 2022-03-22 00:12:38 · 492 阅读 · 0 评论 -
RavenDB 文档建模--建模注意事项
我们在开始讲解如何在 RavenDB 中建模之前,先来看看注意事项,这些内容与我们将要辨析的模型有着直接的关系。这里需要注意的第一点是 不要在不同应用之间建立共享数据库。很多设计者会建立共享数据库,用以在不同的应用之间共享相同的数据,虽然这样做能减少数据存储量,以及实现多应用使用相同数据的目的,但是在 RavenDB 中并不推崇这样的做法。这是因为虽然不同的应用看起来有些数据是一样的,我们会强制它们使用相同的方式处理数据,但是在大多数情况下不同的应用程序使用相互不同的方式处理类似的数据,如果使用共享数据的原创 2022-03-21 23:55:31 · 555 阅读 · 0 评论 -
RavenDB 文档建模--使用 RavenDB 作为键/值存储
RavenDB 非常适合键/值存储,为了确保快速存取数据库,RavenDB 在设计的时候降低了存储和加载文档的成本,这是 RavenDB 和其他数据库相比最大的有点。由于数据限制必须是 JSON ,因此使用 RavenDB 作为键/值存储是完全没问题的。使用 RavenDB 缓存信息的常见场景有:存储购物车信息、存储用户会话数据、缓存热点数据等等。在默认情况下,RavenDB 不会对存储以及加载文档增加额的外成本,因此可以使用所有访问模型中最简单的快速数据库。一般来说键/值建模的复杂性在于生成适当的键以及原创 2022-03-15 12:57:03 · 887 阅读 · 0 评论 -
RavenDB 文档建模 -- 开篇
数据建模直接影响到数据库完成工作的效率,我们。常见的建模时基于关系数据的建模,这种建模被称为数据建模,有点如下:它建立在严格的数学概念之上,具有坚实的理论基础;无论是实体还是实体之间的联系都用关系来表示,对数据的检索结果也是关系;存取路径对用户透明,具有更高的数据独立性,更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。但是如果我们尝试将关系建模方案应用于非关系行数据库时,最终的结果往往时令人尴尬的。这是因为非关系型数据库是 Documents aren’t flat (我称之为立体原创 2022-03-11 23:28:27 · 1201 阅读 · 0 评论