2016-04-29 298 views
1

我正在閱讀Silberschatz書籍的基於對象的數據庫。它解釋了下面的例子類型繼承:類型繼承與表繼承

create type Person 
(
    name varchar(20), 
    address varchar(20) 
); 

現在我們可以使用類型繼承,如:

create type Student under Person 
(
    degree varchar(20), 
    department varchar(20) 
); 

我想我明白了高達了這一點。現在我創建一個Person類型表爲:

create table people of Person; 

但是現在如果我想創建一個類型爲student的表。我應該這樣做:

create table students of Student; 

OR

create table students of Student under people; 
/*which is described in the book as table inheritance*/ 

是什麼上述兩者的區別?由於我們在定義類型的同時已經繼承了Person,因此在創建Student類型的表時,是否需要繼承Person(person)類型的表?

如果有人可以用一個例子來解釋這個問題,它會更清晰。

回答

0

不幸的是,類和繼承的世界以及數據庫的世界並不總是相互映射。

在這個例子中,一種方法是創建2個表:

  • PERSON_ID =表中的主鍵
  • 名稱
  • 地址

學生

  • student_id數據=表的主鍵
  • PERSON_ID =外鍵Person表

如果您Student.Person_Id不爲空,則意味着每個學生在Person表中都有一行。您需要其他的東西,索引或約束(在數據庫中)或邏輯(在操作數據庫的代碼中)來強制執行該學生記錄不共享人員記錄(如果這對您很重要)。

這些表的示例數據:

  • PERSON_ID:12,姓名:先生不-A-學生,地址:999 Letsbe大道
  • PERSON_ID:13,名稱: 女士。畢業生,地址:時尚校園
  • Person_Id:14,姓名:Undergrad先生,地址:Not-so-Swanky校園
  • Person_Id:15,姓名:女士非學生 - 地址:2B Ornottoobee路

學生

  • student_id數據:859,等級:整蠱數學系:數學,PERSON_ID:13
  • student_id數據:860:學歷:說唱歌詞,部:英語,Person_I d:14

人12和15是人,但不是學生。人13和14分別與學生859和860相關聯。

請注意,如果你是真正建立這個,你可能會不同的東西更多一點(在數據庫中發言,標準化的東西):

地址

  • ADDRESS_ID =主鍵
  • 地址行

  • PERSON_ID =主鍵
  • 名稱
  • ADDRESS_ID =外鍵地址表

  • Degree_Id =主鍵
  • 主題

  • DEPARTMENT_ID =主鍵
  • 名稱
  • ADDRESS_ID =外鍵地址(所在部門是)
  • 老闆=外鍵人

學生

  • student_id數據=主鍵
  • Degree_Id =外鍵學位
  • DEPARTMENT_ID =外鍵處
  • PERSON_ID =外鍵人