大多数开发人员已经断断续续的关系建模,并且在以非关系方式模拟数据时,必须做出一个非平凡的精神飞跃。这本身就很难,但是当您使用的数据存储实际上具有多模型功能时会发生什么?作为一个行业,我们看到越来越多的数据库采用这种方式,并提供多种模型来存储和查询数据,作为其核心性质的一部分。例如,ArangoDB,CosmosDB,Couchbase,当然还有RavenDB。
例如,RavenDB为您提供了以下模型:
- 文档(JSON) - 具有接受读写的任何节点的多主机。
- 多个文件的ACID交易。
- 简单/全文查询。
- 映射/减少和聚合查询。
- 二进制数据 - 文档附件。
- 计数器(Map <string,int64>) - CRDT多主分布式计数器。
- 键/值 - 通过Raft协议实现强大的分布式一致性。
- 图形查询 - 在文档模型之上。
- 修订 - 文档的内置审计跟踪
有了这么多选项,当您需要为数据建模时,为工作选择合适的工具可能会令人困惑。在这篇文章中,我的目标是了解RavenDB提供的选项,并指导您做出最佳选择。
您将使用的默认和最常见的模型将是文档模型。它是最适合业务数据的一种,您通常会遵循域驱动设计方法来建模数据和实体。换句话说,我们讨论的是Aggregates,其中每个文档都是一个整体。实体之间的引用要么完全是聚合(和文档)的本地,要么只是聚合之间。换句话说,一个文档中的值不能指向另一个文档中的值。它只能指向另一个文档。
您的大部分业务逻辑都将集中在汇总级别上。即使单个事务修改多个文档,大多数业务逻辑也是在每个聚合上独立完成的。处理这种情况的一个好方法是使用域事件。这允许您组成域逻辑的独立部分,而无需将其全部绑定在一个大结中。
到目前为止,我们讨论过修改文档,但是您对数据执行的大部分操作都是查询并将其呈现给用户。在这些情况下,您需要做出有意识和明确的决定。无