簡體   English   中英

SQL 分層數據的歷史表設計

[英]SQL history table design of hierarchical data

我有一些特定的項目數據,其中包括來自與外鍵鏈接的不同表的多個子項目。 為了向客戶顯示所有相關子項目的項目歷史記錄,我需要將數據更改存儲在數據庫中,並且有幾個選項可供選擇。

  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",
        },
    ],
}

但是,檢索和轉換部分需要時間,並且我們遇到了一些性能問題。

我需要改進當前的結構,但還沒有找到一個有效的結構。

如果您有任何想法,請分享。

謝謝!

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

  • 一個僅包含 customerID、日期和序列化 JSON 的歷史記錄表。 觸發器可以調用將執行此工作的 SP。(推薦的解決方案)

  • 具有 TableName、DateTime、ID、Field、OldValue、NewValue 的歷史記錄表。 同樣的方式,添加記錄的觸發器。

如果您想擁有干凈可靠的歷史記錄,則必須使用觸發器。 這一切都取決於您需要使用此歷史記錄的方式(只是閱讀或使用它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM