Sql-Server

數據庫架構 - 設置與組和/或其成員相關的限制值

  • November 10, 2021

前提是有預先​​存在的表格(下附圖表)。就潛在相關屬性而言,它們每個都有許多案例。儘管如此,我仍然充滿信心地遵循最佳實踐,試圖添加一個特定的功能,我們可以將其稱為Limit及其受尊敬的表和相關屬性,這將不僅僅是一個 int 值。

預先存在的表(簡化為相關屬性):

預先存在的表格圖

極限表:

極限表圖

問題是,我希望能夠對任務和組都應用“限制”值,但是由於利弊,我發現很難在我提出的以下方法之間做出選擇,以及什麼可以被認為是最好的實踐。

方法一:

ERD 方法 1

在 Limit 表中,為每個元組(行)添加兩個外鍵屬性(task_id,group_id)

方法二:

ERD 方法 2

在 Limit 表中,為每個元組(行)添加一個帶有“切換”屬性 (is_group) 的外鍵屬性 (taskgroup_id)

想法:

自然地,我認為第二種方法可以被認為是更好的做法,因為它減少了插入數據庫的 NULL 值的數量,因此更符合關係數據庫結構的路線。

為了簡化功能,應該為每個任務分配一個限制值,但是如果沒有為具有限制值的任務插入限制元組/行,我們應該參考任務的受人尊敬的組的限制值(一個組連結到所有任務)。

根據我列出的方法,就最佳實踐而言,哪種方法會更好,或者您能想到哪種方法比提供的兩種方法更好?

請告知我是否應該在某個地方詳細說明。

兩者都不。TaskLimit 和 GroupLimit 應該是單獨的表,或者是 Task 和 Group 表上的單獨列。

您將更改極限值,對嗎?但不是組的名稱等。

  • 過度規範化——除非有 (1) 數百萬個對名稱的引用或 (2) 名稱經常更改,否則不要打擾名稱。
  • 如果上述更改沒有擺脫多對多映射表,則改進索引;見多:多映射
  • 如果在兩個 ERD 之間仍有選擇,請寫出SELECTs需要的。這可能會幫助您在兩種模式設計之間做出決定。

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