Postgresql
避免關係數據庫中相關表的外鍵重複
我有一個簡單的數據庫模式,描述了屬於某個國家的歷史時期的某些對象,以及(可選)那個時期該國家的細分。下面給出了人為的 UML 類圖:
關係如下:
- a
country
可以有一個或多個歷史時間periods
(由一年間隔定義)。object
是分配給歷史的實體,period
並且可以選擇分配給region
.region
是一個時期的可選細分(如果一個國家被劃分為更小的部分,即德國在 1949-1989 年被劃分為西德/東德)。這種模式存在數據冗餘問題:當一個對像被分配給一個區域時,它有兩個指向
region
和的外鍵period
。指向的region
行也有一個必須指向相同的外鍵period
。因此,如果將區域移動到另一個時期,則必須在多個位置替換鍵。我想到了兩個不受歡迎的解決方案:
- 通過刪除區域-時期關係,但隨后區域失去了與某個時期的邏輯聯繫(通過對象-區域關係,一個區域可能屬於許多時期,這是不可取的);
- 刪除對象-時期關係,但由於對象與地區的關聯是可選的,因此對象將失去與國家的聯繫。
您有任何可以解決數據冗餘問題的架構理念嗎?我正在使用 Django ORM 來定義我的模型。
看起來您可以從對像中完全刪除 Period FK。當分配給一個 Region 時,它已經被分配給分配給該 Region 的 Period。定義一個特殊的區域——一個 NULL 區域,“不是一個區域”,直通區域,一個全包區域,等等——當你的意思是“只分配給 Period 而不是一個 Region”時,它充當一個 Period 的佔位符。 "
我認為,這將涉及對架構的最小更改:從 Object 表中刪除 Period FK 欄位。