1. 程式人生 > >今天總算搞懂了RI (Referential Integrity) 引用完整性

今天總算搞懂了RI (Referential Integrity) 引用完整性

今天總算搞懂了RI (Referential Integrity) 引用完整性

資料的完整性內容比較多,暫不談,現只舉個例子理解一下引用完整性

例項關係:多篇文章(Article)<歸屬於>某一類別(Class)

父子關係:一方為父多方為子

主外來鍵關係:父方主鍵與子方外來鍵關聯

原理:父子關係是通過選定的鍵關聯的,如果某一方的這個鍵變更了,而另一方不作更新,必然造成資料的不正確。如:文章實體用Class外來鍵與類別實體的主鍵ClassId關聯(更確切是文章實體聚合了類別實體),當某類別ID被改或者刪除了,如果文章實體不作相應的操作,那麼文章就不知道是哪個類別的了。

反之,文章的類別被改,那麼文章的類別就可能會出錯,當然系統允許改文章類別另當別論了。

可用事件:看圖,父方只有UPDATE和DELETE事件,而子方只有INSERT和UPDATE事件,是因為,父方插入新記錄(新的類別)不影響子方(現存文章)的資料完整性。反之,刪除一篇文章不影響類別的資料完整性。這裡要注意,事件的物件是關聯雙方的鍵。

可用規則:

  1. 父方:
    1. None:這個不用說了吧,什麼都不幹,當父方的主鍵被更改時;
    2. Restrict(限制):這個報錯,不允許更改,當子方有相應的記錄關聯時;如,刪除某一類別記錄時,文章實體有該類別的文章。
    3. Cascade(級聯):用得最多是這個了吧。級聯更改子方相關記錄。
    4. Set NULL:允許父方更改,子方外來鍵設NULL,在某些場合有用。
    5. Set default:和上類似。
  2. 子方:
    1. None:這個不用說了吧,什麼都不幹,當子方的外來鍵被更改時;
    2. Restrict(限制):這個報錯,不允許更改,當父方沒有相應的記錄關聯時;如,更改某篇文章的類別時,類別表沒有相應的類別記錄。