Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将增量存储在数据库中而不是整个对象中_.net_Sql Server_Bigdata_Database - Fatal编程技术网

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

.net 将增量存储在数据库中而不是整个对象中,.net,sql-server,bigdata,database,.net,Sql Server,Bigdata,Database,我想在数据库中存储/更新具有一长串字段的对象。我计划使用SQL Server(不是2016年),我没有预定义的数据格式来存储这个对象,这意味着我可以将它存储在JSON/BSON中,作为二进制blob等 但是,对于每个更新,我希望保留更改的部分,而不是将对象作为一个整体存储。对于每个请求,这些项目中只有少数将被更改,类似于事件源,我希望重新应用所有这些更改,以获得对象的最终版本。我有以下一些限制: 除了更新现有字段的值外,对象将来可能会发生更改。可以添加新字段,甚至可以删除现有字段。我应该能够处

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

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

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

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

我认为您在描述事件源(ES)和命令查询责任分离(CQR)。因此,研究一下它:

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

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

您可能希望允许属性名中的键路径或.dot符号访问嵌套项

 set('foo.baz.bar',{one:1})
但您可能会觉得需要引入其他动词来指示事件,如设置对象的根或删除键


重播更改以具体化实体。阅读性能问题,这样你就可以为你的用例找到最佳的实现方式。

抛开许多其他的事情要考虑(比如从Deltas重建对象需要多长时间):请看一看稀疏列和列集的概念-也许这会有所帮助。我认为您基本上是在描述事件源(ES)和命令查询责任分离(CQR)。所以好好研究一下:@RobertMoskal,你是对的,我在问题中也提到过(我认为ES很好,不需要CQR)。不过,我这里没有具体的活动。我只是得到了一个物体的差异,它在未来会发生变化。可能是我可以为每个对象定义一个事件,并说事件X带有值Y,表示示例字段“Name”中的更新,以将其值设置为“Foo”。但是,对象的不同版本可能会影响这一点,我必须为每个字段创建一个新事件。对于可维护性来说不是很好。我最近一直在尝试这种方法,它很有效。我可以将一个大型对象网格转换为一组三角形,然后将其准确地转换回对象网格。真正的问题是存储所有这些数据是否切实可行,然后对其进行重新水化,性能是否太差而无法使用。如果我们更改了保存在数据库中的对象的布局,而数据库中的信息在更改后没有更新,该怎么办。数据库中的序列化信息可能与当前对象不兼容。我怎么能理解(版本控制或类似的东西)?不知道你的意思。使用命令更改“对象的布局”,该命令将应用于数据库。数据库表示始终是唯一的真理来源。我可以看到客户没有被告知变更,无法操作数据。我很乐意就这个话题聊上几分钟。我计划将一个对象序列化/反序列化到json或从json中序列化/反序列化。因此,我想存储的对象可能会随时间而变化。例如,我可以添加一个新成员等。但是,我的一条记录可能不包含该成员的任何内容(例如:由于该记录处于非活动状态,因此历史记录中没有添加命令)。json的模式不再与实际对象相关。这是这些场景中的一个普遍问题。当你的客户得不到他们期望的数据时,他们会变得“聪明和宽容”。当你的客户得不到他们需要的东西时,他们可能会“失败”。您还可以使用补偿事务返回并根据需要转换所有实体。您可以将它们作为批处理运行。您可能会混合使用这三种技术。我明白了,版本控制在这种情况下可能会有所帮助吗?但是,为了序列化/反序列化,我还必须保留对象的每个版本。此外,我必须在必要时在它们之间进行转换。