首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型继承与表继承

类型继承与表继承
EN

Stack Overflow用户
提问于 2016-04-29 10:43:20
回答 1查看 1.5K关注 0票数 1

我从Silberschatz的书中读到了基于对象的数据库。它用以下示例解释Type继承:

代码语言:javascript
复制
create type Person
(
    name varchar(20),
    address varchar(20)
);

现在,我们可以使用类型继承,例如:

代码语言:javascript
复制
create type Student under Person 
(
    degree varchar(20),
    department varchar(20)
);

我想我已经明白这一点了。现在,我创建一个类型为Person的表,如下所示:

代码语言:javascript
复制
create table people of Person;

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

代码语言:javascript
复制
create table students of Student;

代码语言:javascript
复制
create table students of Student under people;
/*which is described in the book as table inheritance*/

这两者有什么区别呢?既然我们已经在定义类型“学生”时继承了“人”,那么在创建类型为“学生”的表时,是否需要继承类型为Person ( Person )的表?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-29 15:32:05

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

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

Person

  • Person_Id =表的主键
  • 名字
  • 地址

学生

  • Student_Id =表的主键
  • 学位
  • 部门
  • Person_Id = Person表的外键

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

这些表的示例数据:

Person

  • Person_Id: 12,姓名:Not学生先生,地址:
  • Person_Id: 13,姓名:Grad-学生,地址:一个时髦的校园
  • Person_Id: 14,姓名:本科生先生,地址:不太时髦的校园
  • Person_Id: 15,姓名:Not学生-也可以,地址:地址:

学生

  • Student_Id: 859,学位:棘手的数学,系:数学,Person_Id: 13
  • Student_Id: 860:学位: Rap歌词,系:英语,Person_Id: 14

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

请注意,如果您实际上是在构建它,那么您可能会更多地将事情分离出来(在数据库语言中,将事情规范化):

地址

  • Address_Id =主键
  • Address_line_1
  • 等。

Person

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

  • Degree_Id =主键
  • 主题
  • 等。

部门

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

学生

  • Student_Id =主键
  • Degree_Id =外键到度
  • Department_Id =部门的外键
  • Person_Id =人的外键
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36936249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档