Normalization

目前 2 個表有關係時,如何將 2 個表關聯到第三個表?

  • January 21, 2014

這一次,我發現自己在想出一個好的問題標題方面完全不知所措。

考慮以下三個表格。每個都有額外的列,但只提到與表之間的關係相關的列:

  • a有一個主鍵a_id
  • b有一個主鍵b_id和一個a_id作為外鍵的列a(一對多關係)
  • reference有一個主鍵ref_id

reference是引用來證實其他 2 個表格中包含的資訊的來源列表。因此,我需要表格將它們聯繫在一起。兩者a和都與b具有多對多關係reference,但還有一個複雜的問題:腳註編號。a此腳註編號對於每個and對必須是唯一的,但僅當存在 a和相同reference的關係時才需要。(當然,這必須與相同的.)有關。到目前為止,我想出的表示這種關係的最好方法是一對錶:b``reference``b``a

bridge_a_reference:

  • 列:a_id, ref_id, footnote_num(可為空)
  • 主鍵:a_id,ref_id
  • 外鍵:a_id到表aref_id到餐桌reference

bridge_b_reference:

  • 列:b_id, a_id,ref_id
  • 主鍵:b_id,ref_id
  • 外鍵:b_id, a_idto table b; a_id,ref_id到表bridge_a_reference

這確保了數據的一致性。只有b和之間存在reference對應關係,a並且與正確相關,才可能存在關係。它還確保所有/對的腳註編號都是一致的。但是,它是多餘的,第二次儲存和之間的關係(儘管至少強制保持一致),並且不能確保/關係需要腳註編號。reference``b``a``a``reference``a``b``b``reference

我已經嘗試過幾次重新排列我腦海中的表格,但是我能想到的所有其他事情都允許某種不一致(b對於reference沒有對應關係的a關係reference或關係或/ba的腳註編號不一致。)我怎樣才能更好建構我的橋接表以消除冗餘並確保腳註要求?甚至可能嗎?a``reference

這是一個建議,因此您可以以聲明方式強制執行您想要的約束。(我稍微簡化了表名,刪除了bridge_前綴。)

我們footnote_num從:

Table:      a_ref         -- was named:  bridge_a_reference
    a_id, 
    ref_id
Primary key: 
    (a_id, ref_id)
Foreign keys:
    a_id  -> a
    ref_id -> reference

我們添加了這個表——它基本上只儲存那些a_ref帶有腳註的行,那些你想添加子元素的行b_ref

Table:      a_ref_with_footnote 
   a_id, 
   ref_id,
   footnote_num
Primary key: 
   (a_id, ref_id)
Unique key:
   (a_id, footnote_num)
Foreign keys: 
   (a_id, ref_id)  -> a_ref

a_ref_with_footnote最後,除了現在引用中間表 ( )的外鍵外,第三個表與您的設計保持一致:

Table:     b_ref         -- was named: bridge_b_reference:
    a_id, 
    b_id, 
    ref_id,
Primary key: 
    (b_id, ref_id)
Foreign keys: 
    (a_id, b_id) -> b
    (a_id, ref_id) -> a_ref_with_footnote

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