Sql 类型继承与表继承

Sql 类型继承与表继承,sql,inheritance,database-design,relational-database,object-oriented-database,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

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

以上两者有什么区别?既然我们在定义Student类型时已经继承了Person,那么在创建Student类型的表时是否有必要继承Person(Person)类型的表


如果有人能用一个例子来解释这一点,那会更加清楚。

不幸的是,类和继承的世界与数据库的世界并不总是很好地相互映射

在本例中,一种方法是创建两个表:

  • Person\u Id=表的主键
  • 名字
  • 地址
学生

  • Student_Id=表的主键
  • 程度
  • Person\u Id=Person表的外键
如果将Student.Person\u Id设置为非空,则表示每个学生在Person表中都有一行。如果对您很重要的话,您将需要其他东西,索引或约束(在数据库中)或逻辑(在操纵数据库的代码中)来强制学生记录不共享个人记录

这些表的示例数据:

  • 身份证号码:12,姓名:非学生先生,地址:Letsbe Avenue 999
  • 身份证号码:13,姓名:研究生女士,地址:一个时髦的校园
  • 身份证号码:14,姓名:康拉德先生,地址:不太时髦的校园
  • 身份证号码:15,姓名:Not-a-student-Each女士,地址:奥诺托比路2B号
学生

  • 学号:859,学位:数学,系:数学,学号:13
  • 学号:860:学位:说唱歌词,系:英语,学号:14
12号和15号是人,但不是学生。13人和14人分别与859名和860名学生有联系

请注意,如果您真的在构建它,您可能会将事情分离得更多一些(在数据库中,将事情正常化):

地址

  • 地址\u Id=主键
  • 地址第1行
  • 等等

  • Person\u Id=主键
  • 名字
  • 地址\u Id=地址表的外键
学位

  • 度=主键
  • 主题
  • 等等
部门

  • 部门Id=主键
  • 名字
  • 地址\u Id=地址外键(部门所在地)
  • Boss=个人的外键
学生

  • 学生Id=主键
  • Degree\u Id=度的外键
  • Department\u Id=部门的外键
  • Person\u Id=个人的外键

    • 不幸的是,类和继承的世界与数据库的世界并不总是很好地相互映射

      在本例中,一种方法是创建两个表:

      • Person\u Id=表的主键
      • 名字
      • 地址
      学生

      • Student_Id=表的主键
      • 程度
      • Person\u Id=Person表的外键
      如果将Student.Person\u Id设置为非空,则表示每个学生在Person表中都有一行。如果对您很重要的话,您将需要其他东西,索引或约束(在数据库中)或逻辑(在操纵数据库的代码中)来强制学生记录不共享个人记录

      这些表的示例数据:

      • 身份证号码:12,姓名:非学生先生,地址:Letsbe Avenue 999
      • 身份证号码:13,姓名:研究生女士,地址:一个时髦的校园
      • 身份证号码:14,姓名:康拉德先生,地址:不太时髦的校园
      • 身份证号码:15,姓名:Not-a-student-Each女士,地址:奥诺托比路2B号
      学生

      • 学号:859,学位:数学,系:数学,学号:13
      • 学号:860:学位:说唱歌词,系:英语,学号:14
      12号和15号是人,但不是学生。13人和14人分别与859名和860名学生有联系

      请注意,如果您真的在构建它,您可能会将事情分离得更多一些(在数据库中,将事情正常化):

      地址

      • 地址\u Id=主键
      • 地址第1行
      • 等等

      • Person\u Id=主键
      • 名字
      • 地址\u Id=地址表的外键
      学位

      • 度=主键
      • 主题
      • 等等
      部门

      • 部门Id=主键
      • 名字
      • 地址\u Id=地址外键(部门所在地)
      • Boss=个人的外键
      学生

      • 学生Id=主键
      • Degree\u Id=度的外键
      • Department\u Id=部门的外键
      • Person\u Id=个人的外键
      create table students of Student under people;
      /*which is described in the book as table inheritance*/