繼承這個概念作java開發的同窗應該都很熟悉了,繼承指的是子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的實例域和方法,或子類從父類繼承方法,使得子類具備父類相同的行爲。 數據庫設計的時候也是有繼承關係的,在數據庫設計方法論中繼承有三種,分別是具體表繼承(Concrete Table Inheritance)、單表繼承(Single Table Inheritance)、類表繼承(Class Table Inheritance)。咱們實際設計中常常會不經意中使用到數據庫到繼承,下面分別介紹一下他們的概念:java
具體表繼承
不創建父對象,將父對象的全部屬性轉移到子對象中,爲每一個子對象創建對於的表。數據庫
單表繼承
在一個寬表中列出全部父對象和子對象的屬性,同時用一個標識列表示該行數據存儲的是哪一個子類的數據。數據庫設計
類表繼承
對父對象和每一個子對象創建一個對應的表,而後在子表中設置該子表的主鍵爲與父表關聯的外鍵。設計
假如你如今在作個教學系統,系統中有三個角色:學生、家長、老師。code
學生的屬性:姓名、年齡、性別、身份證、入學時間、學號、學分
家長的屬性:姓名、年齡、性別、職業、學歷
老師的屬性:姓名、年齡、性別、教齡、學科、是否已婚對象
不一樣繼承方案的實現以下:繼承
具體表繼承(三張獨立表)開發
單表繼承(一張大寬表+類型字段用以區分)it
類表繼承(四張表:一張父表表+三張子表)io
具體表繼承
優勢:獲取完整對象不須要聯表查詢;表中沒有無關屬性(跟單表繼承的對比)
缺點:添加公共屬性時須要修改多個表;查詢公共字段展現須要查詢多個表並做union
操做(如:頁面須要展現全部的用戶,顯示用戶的公共字段)
使用場景:適用於子表關聯性較弱的業務場景,而且識別出系統沒有公共數據查詢的需求
單表繼承
優勢:庫表設計簡單,獲取子表數據時不須要join鏈接。
缺點:表空間利用率低,子表出現無關屬性;擴展子表屬性時須要修改數據表(鎖表)。
使用場景: 適用於子類屬性較少的狀況。好比可預見的時間內子類的屬性都比較少時可使用這種方式,畢竟查詢簡單,不須要聯表查詢。
類表繼承
優勢:庫表的層次結構清晰;爲子類添加屬性不用修改父表,添加公共屬性不須要修改子表;查詢公共數據時不須要去查詢多個表;擴展性強
缺點:獲取對象完整數據須要join查詢,在數據量很大時影響查詢效率
使用場景:適用關聯性較強的業務場景,子表屬性變化較大。
數據庫設計的原則就是沒有原則,須要根據業務場景選擇具體的設計方法。
今天說的數據庫繼承方案或者數據庫範式都是這樣,並非說你數據庫設計的擴展性強或者徹底遵循4NF範式消除一切數據一致性問題就最好,設計帶來的join查詢效率也須要慎重考慮。
歡迎關注個人我的公衆號:JAVA日知錄