天天看點

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

在面向對象的程式設計中,使用對象的繼承是一個非常普遍的做法,但是在關系資料庫管理系統rdbms中,使用的是外鍵表示實體(表)之間的關系,那麼對于繼承關系,該怎麼在rdbms中表示呢?一般來說有3種實作方式:

concrete table inheritance(具體表繼承)

single table inheritance(單表繼承)

class table inheritance(類表繼承)

比如在一個教務系統中,有老師學生2個對象,這兩個對象都是“人”對象的子類,是以我們可以建立一個person表,該表有人的公共屬性:姓名、性别等,還有就是資料的唯一辨別,一個id。而教師對象有教師的特有屬性,比如職稱,學生有學生的特有屬性,比如學号。是以我們可以建立person、teacher、student3個表,其關系在powerdesigner中如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

1.具體表繼承。

不建立父對象,将父對象的所有屬性轉移到子對象中,為每個子對象建立對于的表。如果使用這種方法,那麼就隻需要建立teacher表和student表,不需要person表,在powerdesigner中,輕按兩下繼承節點,打開屬性視窗,取消“generate parent”選項,選中“generate children”并選擇“inherit all attributes”,如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

生成的資料庫表将如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

2.單表繼承。

在一個寬表中列出所有父對象和子對象的屬性,同時用一個辨別清單示該行資料存儲的是哪個子類的資料。在powerdesigner中,修改繼承節點的屬性,取消“generate children”,選中“generate parent”,然後在下面添加一個辨別列,叫persontype,如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

生成的資料庫表,在一個寬表中表示如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

可以看到person中的列內建了person、teacher、student這3個表的所有列,同時還多了一個列persontype,這個列就是用來區分這行資料到底表示的是一個學生還是一個老師。

3.類表繼承。

對父對象和每個子對象建立一個對應的表,然後在子表中設定該子表的主鍵為與父表關聯的外鍵。在powerdesigner中,對于繼承節點的屬性,允許生成父和子表,另外,将“inherit only primary attributes”選中。如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

生成的資料庫表如圖所示:

對象的繼承關系在資料庫中的實作方式和PowerDesigner設計

這裡可以看到,teacher的主鍵和student的主鍵同時又是該表的外鍵,連接配接到person表。