对象的继承关系在数据库中的实现方式和PowerDesigner设计
在面向?qū)ο蟮木幊讨?#xff0c;使用對象的繼承是一個非常普遍的做法,但是在關(guān)系數(shù)據(jù)庫管理系統(tǒng)RDBMS中,使用的是外鍵表示實體(表)之間的關(guān)系,那么對于繼承關(guān)系,該怎么在RDBMS中表示呢?一般來說有3種實現(xiàn)方式:
- Concrete Table Inheritance(具體表繼承)
- Single Table Inheritance(單表繼承)
- Class Table Inheritance(類表繼承)
比如在一個教務系統(tǒng)中,有老師學生2個對象,這兩個對象都是“人”對象的子類,所以我們可以建立一個Person表,該表有人的公共屬性:姓名、性別等,還有就是數(shù)據(jù)的唯一標識,一個ID。而教師對象有教師的特有屬性,比如職稱,學生有學生的特有屬性,比如學號。所以我們可以建立Person、Teacher、Student3個表,其關(guān)系在PowerDesigner中如圖所示:
1.具體表繼承。
不建立父對象,將父對象的所有屬性轉(zhuǎn)移到子對象中,為每個子對象建立對于的表。如果使用這種方法,那么就只需要建立Teacher表和Student表,不需要Person表,在PowerDesigner中,雙擊繼承節(jié)點,打開屬性窗口,取消“Generate Parent”選項,選中“Generate children”并選擇“Inherit all attributes”,如圖所示:
生成的數(shù)據(jù)庫表將如圖所示:
2.單表繼承。
在一個寬表中列出所有父對象和子對象的屬性,同時用一個標識列表示該行數(shù)據(jù)存儲的是哪個子類的數(shù)據(jù)。在PowerDesigner中,修改繼承節(jié)點的屬性,取消“Generate children”,選中“Generate parent”,然后在下面添加一個標識列,叫PersonType,如圖所示:
生成的數(shù)據(jù)庫表,在一個寬表中表示如圖所示:
可以看到Person中的列集成了Person、Teacher、Student這3個表的所有列,同時還多了一個列PersonType,這個列就是用來區(qū)分這行數(shù)據(jù)到底表示的是一個學生還是一個老師。
3.類表繼承。
對父對象和每個子對象建立一個對應的表,然后在子表中設置該子表的主鍵為與父表關(guān)聯(lián)的外鍵。在PowerDesigner中,對于繼承節(jié)點的屬性,允許生成父和子表,另外,將“Inherit only primary attributes”選中。如圖所示:
生成的數(shù)據(jù)庫表如圖所示:
這里可以看到,Teacher的主鍵和Student的主鍵同時又是該表的外鍵,連接到Person表。
PS:如果使用NHibernate進行編程,那么可以參考這篇文章,介紹了NHibernate對這三種繼承的配置方法。
如果使用Entity Framework進行編程,那么可以參考這篇文章。
總結(jié)
以上是生活随笔為你收集整理的对象的继承关系在数据库中的实现方式和PowerDesigner设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #35
- 下一篇: 探索PHP7(一)--性能