0

我们正在研究存储对象更改的不同替代方案,并发现 JaVers 似乎正是为此目的而构建的工具。

我们已经构建了一个原型(使用 MySQL 进行更改 repo),它运行良好并交付了所承诺的内容。到目前为止,一切都很好。

然而,JaVers 似乎将其所有内部数据存储在 4 个表中。这对于小型数据集来说不是什么大问题,但是如果原始数据模式有非常大的表(每个表有数百万/数十亿条记录)会发生什么?在如此大的表中更新一条记录意味着向 JaVers 审计表中添加一条记录,该记录将非常大(很可能比原始数据库的大小更大)。

从我们之前处理大型审计表的经验来看,我们遇到了诸如inserts开始变慢、查询占用绝对时间等问题。我们也需要非常频繁地取出增量,所以这看起来像是一个定时炸弹。

1)是否可以配置 JaVers,以便将更改存储在单独的表中,每个实体一个 - 类似于

  • foo_global_id, foo_snapshot, foo_commit,foo_commit_property
  • bar_global_id, bar_snapshot, bar_commit,bar_commit_property

如果目前无法实现,添加这样的功能有多难(我们愿意投入时间并提交补丁)?

2)假设我们有

class Foo {
   String bar;
}

一段时间后,我们决定添加另一个字段

class Foo {
   String bar;
   int baz = 0;
}

我怀疑如果我们更新一个实例Foo并且bar只更改但保留baz = 0,JaVers 将报告更改说baz=0已添加。JaVers 中是否有任何东西旨在处理数据模型更改并避免此类误报?

4

1 回答 1

1

解决方案 a) 您认为在 JaVers SQL 存储库中是不可能的。实施起来会非常困难。考虑在 SQL 中实现跨类查询,例如child-value-objects-filter 。

事实上,这将是某种在 SQL DB 中很难实现的分片。

对于大型数据库,我们建议使用MongoDB ( http://javers.org/documentation/repository-configuration/#mongodb-configuration )。在 MongoDB 中,分片在数据库级别开箱即用。

考虑 b) 问题。我不会说这是误报。对象:{'bar':'a'}{'bar':'a', 'baz':0}是不同的。baz如果为空(整数),您可以消除此类更改。

于 2016-08-03T18:22:14.407 回答