Sql-Server

包含重要敏感數據的所有欄位均可為 NULL 的表

  • August 8, 2019

我需要一個數據庫表來保存有關他們生活方式(酒精/藥物使用/注射等)的敏感患者資訊。

在螢幕上,資訊被分成選項卡——“酒精”、“藥物”、“注射”等。一些數據是相互依賴的(即:一個選項卡中的數據可能取決於另一個選項卡中的輸入內容)。

由於前面提到的相互依賴,我正在考慮將選項卡中擷取的所有數據(大約 25 個欄位 - 可能更多,但不多)儲存在一個表中。表中的所有欄位都可以為空(編輯:有兩個原因:(1)因為人們可能有酒精問題但沒有藥物問題,反之亦然;(2)數據可以處於 DRAFT 或 PRODUCTION 狀態 - 草稿不完整數據是可以接受的,但在生產中必須提供相關數據)

為了提高數據完整性,我將使用 CHECK 約束來確保為表中的欄位集提供數據 如果設置了某些 BIT 標誌(例如,我們處於 PRODUCTION 模式並且設置了一個名為 HasUsedAlcohol 的標誌,這要求所有與酒精相關的欄位都是已填充;HasUsedDrugs 將強制填充所有與藥物相關的欄位)

此外,此表可用於生成報告。

我的問題是 - 這是一個明智的、可維護的解決方案嗎?如果沒有,為什麼不呢?

數據庫目標是 SQL Server 2012。

提前致謝。

我不會擔心 25 列。這不是一個非常高的數字。它甚至沒有違反Swart 的 10% 規則(102 列)。當然,這裡的“規則”是在討論一個限制,而不是一個目標,所以請記住這一點😃

在我看來,理想情況下,這些單獨的“表格”(選項卡)中的每一個都將由其自己的表(AlcoholAbuse、DrugAbuse、Inj​​ections 等)支持,然後通過外鍵約束將其連結回患者。

但是,您提到存在跨表單的數據驗證問題。也許如果您對藥物表格上的某些問題回答“是”,那麼注射表格上的某些問題是必需的。

由於CHECK約束確實是執行您所描述內容的最佳方式,這意味著它們都需要在同一個表中。

如果事情在單獨的表中,您的其他選擇是將驗證移動到應用程序層,或者使用觸發器來確保不同表單表中的數據在每次插入/更新時都是有效的。

由於列的數量並不多,而且您可能不想招致處理觸發器的複雜性,我認為一個帶有條件CHECK約束的表是一種有效的解決方案

這個解決方案對我來說似乎是可維護的,並且相當容易推理,因為所有“規則”都在一個地方(一個表,以及應用於該表的約束)。

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