类型继承与表继承

时间:2016-04-29 10:43:21

标签: sql inheritance database-design relational-database object-oriented-database

我正在阅读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;

但现在如果我想创建一个学生类型的表。我应该这样做:

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)类型的表?

如果有人能通过一个例子来解释这一点,那将会更加清晰。

1 个答案:

答案 0 :(得分:0)

不幸的是,类和继承的世界以及数据库的世界并不总是相互映射。

在此示例中,一种方法是创建2个表:

<强>人

  • Person_Id =表格的主键
  • 名称
  • 地址

<强>学生

  • Student_Id =表格的主键
  • Person_Id = Person表的外键

如果您使Student.Person_Id不为null,则表示每个学生在Person表中都有一行。您需要其他东西,索引或约束(在数据库中)或逻辑(在操作数据库的代码中)来强制学生记录如果对您来说很重要,则不会共享人员记录。

这些表的示例数据:

<强>人

  • Person_Id:12,姓名:Mr.-a-student,地址:999 Letsbe Avenue
  • Person_Id:13,姓名:Grad-student女士,地址:时髦的校园
  • Person_Id:14,姓名:Undergrad先生,地址:不那么时髦的校园
  • Person_Id:15,姓名:Not-a-student女士,地址:2B Ornottoobee Road

<强>学生

  • Student_Id:859,学位:棘手的数学,系:数学,Person_Id:13
  • Student_Id:860:学位:Rap Lyrics,Department:English,Person_Id:14

12和15人是人,但不是学生。第13和第14人分别与学生859和860相关联。

请注意,如果您实际构建了这个,那么您可能会将事情分开一些(在数据库中说,将事物规范化):

<强>地址

  • Address_Id =主键
  • 地址行

<强>人

  • Person_Id =主键
  • 名称
  • Address_Id =地址表的外键

<强>度

  • Degree_Id =主键
  • 主题

<强>系

  • Department_Id =主键
  • 名称
  • Address_Id =地址的外键(部门所在地)
  • Boss =人的外键

<强>学生

  • Student_Id =主键
  • Degree_Id = Degree的外键
  • Department_Id =部门的外键
  • Person_Id =人的外键