在数据库中存储增量而不是整个对象

时间:2016-09-13 11:17:02

标签: .net sql-server bigdata database

我想在数据库中存储/更新一个包含很长字段列表的对象。我打算使用SQL Server(而不是2016),我没有预定义的数据格式来存储这个对象,这意味着我可以将它存储在JSON / BSON中,作为二进制blob等。

但是,对于每次更新,我都希望保留更改的部分,而不是将对象作为一个整体存储。对于每个请求,只有少数这些项目会被更改,类似于事件源,我想重新应用所有这些更改,以获得对象的最终版本。我在下面列出了一些限制因素:

  • 除了更新现有字段的值之外,对象可能会在将来发生变化。可以添加新字段,甚至可以删除现有字段。我应该能够处理这种情况。当前对象可能与我们上次更新数据库中的项目时的对象完全不同。我看到Gson看起来很有趣。
  • 当然应该在性能和节省空间之间取得平衡。但是,节省空间比速度更重要。

我阅读了json补丁和一些针对此类问题的自定义解决方案,但想要了解有关此主题的更多信息。但是,我不想重新发明轮子,但是一个易于实现的方法(如果有一个库/框架支持当然更好)会很好。

1 个答案:

答案 0 :(得分:2)

我认为您几乎都在描述事件采购(ES)和命令查询责任隔离(CQRS)。所以要研究它:documentation

可以用一点命令语言来描述对JSON对象的更改。它可以很简单:

KeyNavigation.down: button2

并将其存储在数据库中。如果您只有一个命令,则可以完全避免存储动词。

您可能希望允许属性名称中的密钥路径或.dot表示法访问嵌套项

set(property,value) 

但您可能觉得需要引入其他动词来指示设置对象根目录或删除密钥等事件。

重播更改以实现您的实体。阅读性能问题,以便为您的用例提供最佳实现。