Javers将数据保存在单个表中的潜在可伸缩性问题?

时间:2016-08-02 15:50:43

标签: javers

我们正在调查different alternatives以存储对象更改,并找到了JaVers,它们似乎是为此目的而构建的工具。

我们已经构建了一个原型(使用MySQL进行变更回购),该原型已经很好地完成并实现了承诺。到目前为止一切都很好。

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

根据我们之前对大型审计表的经验,我们遇到的问题包括inserts开始变慢,查询占绝对年龄等等。我们需要经常得到三角洲,所以这似乎是一个滴答作响的定时炸弹。

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

  • foo_global_idfoo_snapshotfoo_commitfoo_commit_property
  • bar_global_idbar_snapshotbar_commitbar_commit_property

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

2)我们说我们有

class Foo {
   String bar;
}

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

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

我怀疑如果我们更新Foo的实例并仅更改bar但保留baz = 0,JaVers将报告已添加baz=0的更改。 JaVers中有什么东西可以用来处理数据模型的变化并避免这种误报吗?

1 个答案:

答案 0 :(得分:1)

解决方案a)您认为在JaVers SQL Repository中无法实现。实施起来非常困难。考虑在SQL中实现像child-value-objects-filter这样的跨类查询。

实际上它会是某种分片,在SQL DB中很难实现。

对于大型数据库,我们建议使用 MongoDB http://javers.org/documentation/repository-configuration/#mongodb-configuration)。在MongoDB中,分片在DB级别可以直接使用。

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