【问题标题】:RavenDB Revision management on application level应用程序级别的 RavenDB 修订管理
【发布时间】:2019-01-13 21:34:30
【问题描述】:

很遗憾,这是一个非常笼统的问题...

想象一个创作应用程序来创建例如电气原理图。工程师绘制原理图,直到他们对自己的产品感到满意并可以投入生产。

此时将启动“修订”(例如修订“#1”)。从现在起,此修订版的所有数据/文件都不能再更改。它是只读的。

随着时间的推移,工程师们有了聪明的想法,并开始根据 Revision #1 更新现有的原理图。他们添加新功能、删除功能、用较新版本替换某些组件等,直到他们有 Revision #2。

那么一个共同的要求是:Rev.1 和 2 之间发生了什么变化?需要一些增量报告。

这对 RavenDB 意味着什么?

  1. 如果工程师开始新的修订,这是否意味着 复制所有文档并使用新的 ID 插入它们 “/proj-1/rev-2/component-1000”?我将如何更新文档之间的关系 然后? “手动”调整所有关系?

  2. 快照数据库?我可以将快照数据库与当前数据库进行比较吗?

  3. 如何找到这些修订之间的所有差异?
  4. 如果我不复制所有文档或对其进行快照,我是否需要将所有更改保存在单独的文档中(事件日志样式),即 DocX 已删除,DocY 已更新为 Value1,DocZ 已添加等?
  5. 我知道 RavenDb 有自己的修订系统。它基于文档的单个更改。这可以在这里发挥优势吗?

任何关于如何建模这样一个系统的提示都将受到高度赞赏。

【问题讨论】:

    标签: ravendb data-modeling


    【解决方案1】:

    RavenDB 具有文档修订的概念,它创建文档的只读快照。每当您修改文档时都会创建它们。

    根据您的需要,我建议创建:plans/1238-A 作为文档本身。 每当您需要标记只读修订版时,请使用:plans/1238-A/revisions/1 或类似的东西。

    我建议不要修改任何引用,指向相同的位置,但是在阅读修订时,询问被引用的修订

    【讨论】:

    • 不太确定我是否理解您的建议。 1.打开内置修订。 2. 如果需要在应用程序级别进行修订并且更新了文档,则使用新 ID 存储文档(换句话说:复制它)。添加的文档也会获得新的 ID。 Rev.2中的删除如何处理?
    • 如果启用了修订功能,那么当您删除具有修订的文档时,您仍然可以通过“修订箱”访问其修订。见ravendb.net/docs/article-page/4.1/Csharp/server/extensions/…
    • 我想我应该用新的 ID 存储它并立即删除它。否则我无法区分 Rev1 开发时的删除和 Rev2 中的删除。另一个问题是如何查询这一切?我会收到带有“旧”ID 的文档和带有新 ID 的文档。如何只取属于Rev2(最新修改日期)的那些?查询 Id(或 Id 的一部分)是不可能的,对吧?
    • 要加载包含公共前缀的多个实体,请使用 LoadStartingWith 方法。见loading-entities - loadstartingwith
    • @Danielle 不知道这个!太棒了!
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多