【发布时间】:2019-09-19 06:13:18
【问题描述】:
我有一些特定的项目数据,其中包括来自与外键链接的不同表的多个子项目。为了向客户展示项目与所有相关子项目的历史记录,我需要将数据更改存储在数据库中,并且有几个选项可供选择。
使用所有表的触发器创建 _hist 表,以便在任何表发生更改时存储数据。所有更改都已存储,但很难从所有表中获取项目的数据,因为_hist 表之间没有连接
使用所有表中的所有列创建一个历史记录表。由于项目存在层次结构,因此无法仅将更改存储在一行中。
由于上述所有操作均未按预期工作,因此最终创建了一个历史表,其中包含 Id、时间戳等列以及用于存储更改的附加列。
只要有变化,我们就检索所有的表,将数据转换成 JSON 格式,并保存在历史表中。转换后的 JSON 数据与下图类似。
{
"ItemId": 1,
"ItemStatus": 100,
"SubItmems": [
{
"SubItemId": 1,
"ItemId": 1,
"SubItemStatus": 200,
"SubChildItems": [
{
"SubChildItem": 1,
"SubItemId": 1,
"SubChildItemStatus": 300,
},
{
"SubChildItem": 2,
"SubItemId": 1,
"SubChildItemStatus": 400,
},
],
}
],
"ItemTags": [
{
"TagId": 1,
"TagStatus": "OK",
},
],
}
但是,检索和转换部分需要时间,而且我们遇到了一些性能问题。
我需要改进当前的结构,但还没有找到一个有效的结构。
如果您有任何想法,欢迎分享。
谢谢!
【问题讨论】:
-
您使用的是什么版本的 SQL Server?
-
SQL Server 2017 14.0
-
如果我在你的位置,我会选择临时表。我希望我今天晚些时候有时间写一个答案。
-
我刚开始检查临时表。如果您能提供更多见解,我们将不胜感激。
标签: sql sql-server database-design