任务描述
本关任务:将层次模型转化为关系模型。
相关知识
层次型数据模型
层次模型是数据库系统中最早出现的数据模型,层次数据库系统采用层次模型作为数据的组织方式。它采用树形结构来表示各类实体以及实体间的联系。
其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构中的树(或者二叉树)的定义可知,每棵树都有且仅有一个根节点,其余的节点都是非根节点。每个节点表示一个记录类型对应与实体的概念,记录类型的各个字段对应实体的各个属性。各个记录类型及其字段都必须记录。
上图中,R1、R2 等表示实体类型,也叫做结点,每个实体类型可包含若干个属性,也叫做字段。R1 结点和 R2 结点之间的关系叫做实体间联系。R1 结点叫做根结点,R2 结点和 R3 结点叫做 R1 结点的子节点。R1 结点叫做 R2 结点的双亲结点。没有子结点的结点也叫做叶结点,如 R3 、R4和 R5。
以学校某个系的组织结构为例:
-
实体系是根结点,由系编号和系名2个属性(字段)组成。它有两个子结点,分别是教研室实体和学生实体。
-
实体教研室是系的子结点,它由教研室编号和教研室名2个属性(字段)组成。
-
实体学生是系的子结点,它由学号、姓名和成绩这3个属性(字段)组成,由于它没有子结点,所以也叫叶结点。
-
实体教师是教研室的子结点,它由教师编号、教师姓名和研究方向组成,由于它没有子结点,所以也叫叶结点。
层次模型的数据操纵与完整性约束
- 数据操纵
层次模型的数据操纵主要有查询、插入、删除和更新,进行插入、删除、更新操作时要满足其完整性约束条件。
-
无相应的双亲结点值就不能插入子女结点值
-
如果删除双亲结点值,则相应的子女结点值也被同时删除
-
更新操作时,应更新所有相应记录,以保证数据的一致性
- 完整性约束
-
数据及其联系所具有的制约和依赖规则
-
保证数据库中数据的正确性、有效性和相容性
-
通过指针维护父子关系
层次模型优缺点
- 优点
-
层次模型的数据结构比较简单清晰
-
查询效率高,性能优于关系模型,不低于网状模型
-
层次数据模型提供了良好的完整性支持
- 缺点
-
结点之间的多对多联系表示不自然
-
对插入和删除操作的限制多,应用程序的编写比较复杂
-
查询子女结点必须通过双亲结点
-
层次命令趋于程序化
层次模型转化为关系模型
关系模型是现在数据库的主流模型,要想把层次模型转化为关系模型,只需把层次模型中的各个实体通过外键关联即可。
现有一个层次模型如下:
该层次模型有三个实体,分别是系、教研室和学生。我们可以把它转化为如下图的关系模型:
可以看出转化为关系模型后,依旧有3个实体,各实体之间通过系编号这一属性形成关联,这一属性体现在建表语句中就是添加外键。
编程要求
在右侧编辑器中的Begin-End
之间编写 SQL 语句,将指定的层次模型转换为相应的关系模型后创建表并插入数据。具体要求如下:
- 层次模型图
将学生表命名为 student,教研室表命名为 edu,院系表命名为 dept,职工表命名为 emp。其中表中字段解释如下:
字段名 | 建表用字段名 |
---|---|
系号 | dept_id |
系名 | dept_name |
地址 | addr |
教研室号 | edu_id |
教研室名 | edu_name |
学号 | student_id |
姓名 | student_name |
年级 | level_class |
职工号 | emp_id |
姓名 | emp_name |
职称 | title |
注意:创表时外键字段名和主键字段名一致
插入数据如下图:
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
#请在此添加实现代码
########## Begin ##########
#在mydb库中创建表并插入数据
CREATE TABLE dept (dept_id CHAR (3) PRIMARY KEY,dept_name VARCHAR (20) NOT NULL,addr VARCHAR (100)
);
CREATE TABLE edu (edu_id CHAR (3) PRIMARY KEY,edu_name VARCHAR (20),dept_id CHAR (3),FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
CREATE TABLE student (student_id CHAR (10) PRIMARY KEY,student_name VARCHAR (10),level_class CHAR (3),dept_id CHAR (3),FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
CREATE TABLE emp (emp_id CHAR (10) PRIMARY KEY,emp_name VARCHAR (10),title VARCHAR (10),edu_id CHAR (3),dept_id CHAR (3),FOREIGN KEY (edu_id) REFERENCES edu (edu_id),FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
INSERT INTO dept VALUES ('D02', '计算机', 'R1101');
INSERT INTO edu VALUES ('R01', '数据库', 'D02'),('R02', '网络', 'D02'),('R03', '人工智能', 'D02');
INSERT INTO student VALUES ('S0012', '王明','G1','D02'),('S0020', '郑直','G2', 'D02'),('S0199', '周密','G3', 'D02');
INSERT INTO emp VALUES ('E1101', '何璧','教授','R01', 'D02'),('E3721', '刘新','讲师','R01', 'D02'),('E1234', '王思','教授','R03', 'D02'),('E3722', '付弈','助教','R03', 'D02');
########## End ##########