Sql-Server

保留值和附加列的數據庫設計

  • September 10, 2014

我和我的同事在設計數據庫時遇到了一些麻煩,我正在盡我所能暫時遠離 EAV。

我們有一個名為Preparation儲存機器配置數據的實體。每台機器有兩種類型的程序,我們稱之為process1and process2,一台機器只能有一個程序。這兩個程序共享許多屬性,因此設置一張表似乎是合乎邏輯的。

但是process2有很多額外的數據,甚至用 對自己進行子分類process2aprocesses2b這是特定於這些子類別的(process1目前只有一個額外的屬性)。這樣一個表將在不特定於其程序的列中包含空值。

為每個程序拆分錶是另一種選擇。但是,我們需要保留任何數據更改,並且拆分錶會帶來更多工作(大多數事務都將INSERTS帶有時間戳記到歷史表中,UPDATE如果它們正在更新記錄,則在活動表上加上時間戳)。例如,如果一台機器從 更改process1process2,則必須將一條記錄從 插入到歷史表中,從process1中刪除process1,然後再插入到process2中。我們使用的是標準版 SQL Server,因此沒有 CDC 來幫助記錄更改。

我試圖保持這些非常相關,並且我不想創建一個帶有預期 NULLSSPARSE的表(如果 NULL 百分比很高,可能會創建列?)。

我希望有人對這種情況有經驗。謝謝你。

將各種過程視為子類型。然後會有 entity process_base,它包含流程特定屬性的所有公共屬性process1,process2process2a

將它們分別實現為一個表。將它們組合在一起的視圖可以簡化使用

create view process_all as
select <whatever>
from process_base
inner join process1 <etc>

union all

select <whatever>
from process_base
inner join process2 <etc>
...

通過這種方式,您可以最小化 NULL 列(如果您希望這樣做),但將“過程”的統一性保持為一個單一的想法。

引用自:https://dba.stackexchange.com/questions/76136