我们正在调查different alternatives以存储对象更改,并找到了JaVers,它们似乎是为此目的而构建的工具。
我们已经构建了一个原型(使用MySQL进行变更回购),该原型已经很好地完成并实现了承诺。到目前为止一切都很好。
然而,似乎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中有什么东西可以用来处理数据模型的变化并避免这种误报吗?
答案 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(整数),则可以消除此类更改。