一般来说,我对 mongodb 和 NoSQL 数据设计有点陌生。
我正在构建一个将包含一些非规范化数据的 mongodb 数据库。例如,我的“用户”文档包含对零个或多个“文章”文档的引用(只是 id),而我的文章文档包含对零个或多个用户的引用。
由于我使用的是存储库模式,因此我的数据访问层的任何部分都不知道文章和用户。我应该在我的代码中的哪个位置检查以确保我的所有文档彼此一致?我应该简单地让 DAL 的用户代码进行检查吗?
偶尔运行一次数据完整性脚本以检查一切是否一致是个好主意吗?
一般来说,我对 mongodb 和 NoSQL 数据设计有点陌生。
我正在构建一个将包含一些非规范化数据的 mongodb 数据库。例如,我的“用户”文档包含对零个或多个“文章”文档的引用(只是 id),而我的文章文档包含对零个或多个用户的引用。
由于我使用的是存储库模式,因此我的数据访问层的任何部分都不知道文章和用户。我应该在我的代码中的哪个位置检查以确保我的所有文档彼此一致?我应该简单地让 DAL 的用户代码进行检查吗?
偶尔运行一次数据完整性脚本以检查一切是否一致是个好主意吗?
这是 Microsoft 关于存储库模式的文章。从该文件中:
使用存储库将检索数据并将其映射到实体模型的逻辑与作用于模型的业务逻辑分开。
你有几个问题:
我应该在我的代码中的哪个位置检查以确保我的所有文档彼此一致?
基于上面的陈述,我认为很明显这个逻辑属于Repository。这些对象之间的关系只存在于“业务逻辑”层,数据库无法强制执行这些类型的规则。
我应该简单地让 DAL 的用户代码进行检查吗?
他们怎么可能?作为存储库的作者,您是DAL 用户。对于 MongoDB,DAL 基本上是驱动程序。
您可能会在驱动程序周围编写一个包装器,以某种形式的事务包装多个写入。但是你必须写这个,MongoDB 没有事务的概念。
偶尔运行一次数据完整性脚本以检查一切是否一致是个好主意吗?
归根结底,编写存储库的人将对数据的完整性负责。这样的脚本可能有用,但肯定会占用大量 CPU 周期。
我对 N:M 映射的建议是开始构建一些基本块来处理保持这两个同步所需的多个写入。一个想法是将更改排队并让后台作业进行更新。这样您就不必担心多次写入和回滚会导致错误数据。