Javers 将数据保存在单个 table 中的潜在可扩展性问题?

Potential scalability issue with Javers keeping data in a single table?

我们正在研究 different alternatives 以存储对象更改,并发现 JaVers 似乎是专门为此目的构建的工具。

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

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

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

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

如果目前不可能,添加这样一个功能会有多难(我们愿意投入时间并提交补丁)?

2) 假设我们有

class Foo {
   String bar;
}

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

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

我怀疑如果我们更新 Foo 的实例并仅更改 bar 但保留 baz = 0,JaVers 将报告更改说 baz=0 已添加。 JaVers 中是否有任何设计用于处理数据模型更改并避免此类误报的内容?

您建议的解决方案 a) 在 JaVers SQL 存储库中是不可能的。这将很难实施。考虑在 SQL.

中实施交叉 class 查询,例如 child-value-objects-filter

事实上,这将是某种分片,在 SQL 数据库中很难实现。

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

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