【问题标题】:SQL history table design of hierarchical data分层数据的SQL历史表设计
【发布时间】:2019-09-19 06:13:18
【问题描述】:

我有一些特定的项目数据,其中包括来自与外键链接的不同表的多个子项目。为了向客户展示项目与所有相关子项目的历史记录,我需要将数据更改存储在数据库中,并且有几个选项可供选择。

  1. 使用所有表的触发器创建 _hist 表,以便在任何表发生更改时存储数据。所有更改都已存储,但很难从所有表中获取项目的数据,因为_hist 表之间没有连接

  2. 使用所有表中的所有列创建一个历史记录表。由于项目存在层次结构,因此无法仅将更改存储在一行中。

由于上述所有操作均未按预期工作,因此最终创建了一个历史表,其中包含 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


【解决方案1】:

一些想法(不知道是否适用但分享):

  • 在 blob 中仅包含 customerID、日期和序列化 JSON 的历史记录表。 Trigger 可以调用 SP 来完成这项工作。(推荐的解决方案)

  • 具有 TableName、DateTime、ID、Field、OldValue、NewValue 的历史记录表。同样的方式,添加记录的触发器。

如果您想拥有干净可靠的历史记录,则必须使用触发器。 这一切都取决于您需要使用此历史记录的方式(只是阅读或使用它。)

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多