Postgresql

避免關係數據庫中相關表的外鍵重複

  • February 21, 2019

我有一個簡單的數據庫模式,描述了屬於某個國家的歷史時期的某些對象,以及(可選)那個時期該國家的細分。下面給出了人為的 UML 類圖:

在此處輸入圖像描述

關係如下:

  • acountry可以有一個或多個歷史時間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 欄位。

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