多表设计
-- 多表设计
/*
什么时候用到多表?
1.存储不同的信息时 2.为减少数据冗余
多表设计中表与表如何关联?
数据库设计范式:
第一范式:列的原子性(不可再分)
第二范式:要有主键,其他字段都依赖于主键
第三范式:要消除传递依赖,方便理解,可以看做是“消除冗余”
学生信息表:学号,姓名,性别,生日,手机号,年级id,注册时间
年级表:年级id,年级名称
老师信息表:工号,姓名,性别,年级id
课程信息表:课程号,课程名
弱关系:表与表关联时没有任何约束
强关系:表与表之间存在约束关系
表与表之间的关联关系
一对一:一个人对应一张身份证
一对多:一个年级有多个学生
多对一:多个学生对应一个年级
多对多:一个学生可以选修多门课程,一个课程可以被多个同学选修
*/
创建数据库
CREATE DATABASE IF NOT EXISTS school_db CHARSET utf8
分别创建年级表,学生表,课程表和选课表。并为他们添加约束和对应外键。
-- 年级表(主表)
CREATE TABLE t_grade (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(15))
-- 学生表(年级号为学生表的外键)
CREATE TABLE t_student
(num INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(15)NOT NULL,
sex CHAR(1),birthday DATE,phone CHAR(11),grade_id INT, reg_time DATETIME)
-- 修改表,添加年级外键约束。 外键与另一个表的主键对应 。
ALTER TABLE t_student ADD CONSTRAINT grade_fk FOREIGN KEY (grade_id) REFERENCES t_grade(id)
-- 课程表
CREATE TABLE t_course(cnum INT PRIMARY KEY AUTO_INCREMENT,cname VARCHAR(15))
-- 选课表
CREATE TABLE t_sc(num INT ,cnum INT,
CONSTRAINT student_fk FOREIGN KEY(num)REFERENCES t_student(num),
CONSTRAINT course_fk FOREIGN KEY (cnum) REFERENCES t_course(cnum))
为各表添加数据如下图:
年级表:
学生表:
课程表:
选课表:
树形目录结构:
外码约束图: