數據庫設計方法論 - 繼承

繼承這個概念作java開發的同窗應該都很熟悉了,繼承指的是子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的實例域和方法,或子類從父類繼承方法,使得子類具備父類相同的行爲。 數據庫設計的時候也是有繼承關係的,在數據庫設計方法論中繼承有三種,分別是具體表繼承(Concrete Table Inheritance)、單表繼承(Single Table Inheritance)、類表繼承(Class Table Inheritance)。咱們實際設計中常常會不經意中使用到數據庫到繼承,下面分別介紹一下他們的概念:java

概念解析

  • 具體表繼承
    不創建父對象,將父對象的全部屬性轉移到子對象中,爲每一個子對象創建對於的表。數據庫

  • 單表繼承
    在一個寬表中列出全部父對象和子對象的屬性,同時用一個標識列表示該行數據存儲的是哪一個子類的數據。數據庫設計

  • 類表繼承
    對父對象和每一個子對象創建一個對應的表,而後在子表中設置該子表的主鍵爲與父表關聯的外鍵。設計

設計示例

假如你如今在作個教學系統,系統中有三個角色:學生、家長、老師。code

學生的屬性:姓名、年齡、性別、身份證、入學時間、學號、學分
家長的屬性:姓名、年齡、性別、職業、學歷
老師的屬性:姓名、年齡、性別、教齡、學科、是否已婚對象

不一樣繼承方案的實現以下:繼承

  • 具體表繼承(三張獨立表)開發

    • 學生表(ID、姓名、年齡、性別、身份證、入學時間、學號、學分)
    • 家長表(ID、姓名、年齡、性別、職業、學歷)
    • 老師表(ID、姓名、年齡、性別、教齡、學科、是否已婚)
  • 單表繼承(一張大寬表+類型字段用以區分)it

    • 用戶表(ID、姓名、年齡、性別、身份證、入學時間、學號、學分、職業、學歷、教齡、學科、是否已婚、類型)
  • 類表繼承(四張表:一張父表表+三張子表)io

    • 用戶表(ID、姓名、年齡、性別)
    • 學生表(ID、用戶ID、身份證、入學時間、學號、學分)
    • 家長表(ID、用戶ID、職業、學歷)
    • 老師表(ID、用戶ID、教齡、學科、是否已婚)

方案對比

  • 具體表繼承

    優勢:獲取完整對象不須要聯表查詢;表中沒有無關屬性(跟單表繼承的對比)

    缺點:添加公共屬性時須要修改多個表;查詢公共字段展現須要查詢多個表並做union操做(如:頁面須要展現全部的用戶,顯示用戶的公共字段)

    使用場景:適用於子表關聯性較弱的業務場景,而且識別出系統沒有公共數據查詢的需求

  • 單表繼承

    優勢:庫表設計簡單,獲取子表數據時不須要join鏈接。

    缺點:表空間利用率低,子表出現無關屬性;擴展子表屬性時須要修改數據表(鎖表)。

    使用場景: 適用於子類屬性較少的狀況。好比可預見的時間內子類的屬性都比較少時可使用這種方式,畢竟查詢簡單,不須要聯表查詢。

  • 類表繼承

    優勢:庫表的層次結構清晰;爲子類添加屬性不用修改父表,添加公共屬性不須要修改子表;查詢公共數據時不須要去查詢多個表;擴展性強

    缺點:獲取對象完整數據須要join查詢,在數據量很大時影響查詢效率

    使用場景:適用關聯性較強的業務場景,子表屬性變化較大。

總結

數據庫設計的原則就是沒有原則,須要根據業務場景選擇具體的設計方法。

今天說的數據庫繼承方案或者數據庫範式都是這樣,並非說你數據庫設計的擴展性強或者徹底遵循4NF範式消除一切數據一致性問題就最好,設計帶來的join查詢效率也須要慎重考慮。

歡迎關注個人我的公衆號:JAVA日知錄

相關文章
相關標籤/搜索