数据库设计范式(数据库设计规则)

数据库设计范式(数据库设计规则)

如何将多个信息合理进行组织?

设计范式:

第一范式:

满足列的原子性(不可拆分)

eg:联系方式列:电话列,qq列,邮箱列…

第二范式:

数据库表中必须要有主键,能唯一表示某条记录的列(有些表可以没有主键)

第三范式:

确保每列都和主键直接相关而不是间接相关,要求一个数据库表中已在其他表中包含的非主键字信息

一张表中存储一类信息,在一张表中关联其他表中的数据时,只需要关联主键列即可

eg:一个订单有编号,订单对应的商品也有编号,订单有自己的内容比如数量,商品编号,价钱,商品也有自己的内容,比如商品名称,可以把商品编号另写一个商品表,然后通过订单里的商品编号找到商品里的内容

eg:学生有自己的信息,其中有自己选的专业,不同的专业还对应了不同的主键,所以不用在student表后面添加majorid和major,直接创建一个major表,然后在student添加一个majorid以此来对应专业

CREATE TABLE major( 
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
)
ALTER TABLE stu ADD majorid INT

外键:

但由此又产生一个问题,如果major中某个专业删除了,student里的对应的id应该也被删除,但是我们发现并不会,所以要引入一个外键

外键 是在一个表中用来和另一个表的主键进行关联对应的

1.不加外键:

可以对任意表数据进行操作,两个表数据对应不上也没有影响

2.加外键:

两张表操作时,不可以让两个表对应关系不成立

语法:

alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
ALTER TABLE stu ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid) REFERENCES major(id)

删除外键:

ALTER TABLE student DROP FOREIGN KEY fk_student_major_majorid
应用:

– 学生选课 一个学生至少选两个课
– 课程信息表 多对多关系设计

CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
)

-- 添加一个学生选课表   学生和课程关系表    放一个学生学号外键,放一个课程外键
CREATE TABLE student_course(
	stunumber INT,
	courseid INT
)

ALTER TABLE student_course ADD CONSTRAINT fk_stunumber FOREIGN KEY(stunumber) REFERENCES student(number)
ALTER TABLE student_course ADD CONSTRAINT fk_courseid FOREIGN KEY(courseid) REFERENCES course(id)

这个stunumber和student里的number关联,courseid和course里的id关联,这样子不能轻易删除number和id了,并且一个学生1可以有3课程,4课程,一个课程3可以被学生1和学生2关联

关联查询:

语法:

SELECT 要查询的列
FROM 要查询的表
INNER JOIN 外表 ON 主表的外键=外表的主键  
内关联:

完成上述之后,假如要同时查询主表和外表的话直接用

SELECT * FROM stu,major

会发现关联时没有限制会产生笛卡尔乘积现象,也就是主表外键和外表的主键没有一一对应

那避免这种情况就要使用关联查询的内关联

SELECT s.stu_num,s.stu_name,s.majorid,m.id,m.name AS mname
FROM stu s
INNER JOIN major m ON s.majorid = m.id    -- 把满足条件关联在一起

SELECT s.stu_num,s.stu_name,s.majorid,m.id,m.name AS mname
FROM stu s,major m
WHERE s.majorid = m.id    -- 先产生一个笛卡尔乘积 然后根据条件筛选
左外关联:

如果有一个同学叫陈六,他没选择专业那他的专业id为null,这样子m.id和s.majorid匹配不上,那要显示陈六没选专业该怎么办?

需要用到左外关联,可以在匹配条件成立基础上显示左表的所有数据

-- 左外关联
SELECT s.stu_num,s.stu_name,s.majorid,m.id,m.name AS mname
FROM stu s
LEFT JOIN major m ON s.majorid = m.id 
右外关联:

如果网络专业没有人选择,那要统计专业选择的个数时,同样因为m.id和s.majorid匹配不上会不显示网络专业的情况

需要用到右外关联,可以在匹配条件成立基础上显示右表的所有数据

-- 右外关联
SELECT 
COUNT(stu_num),
m.name mname
FROM stu s RIGHT JOIN major m ON s.majorid = m.id
GROUP BY m.name

相关推荐

  1. 数据库设计范式(数据库设计规则)

    2023-12-17 08:00:03       43 阅读
  2. 数据库设计规范(三大范式

    2023-12-17 08:00:03       17 阅读
  3. 数据库设计范式

    2023-12-17 08:00:03       23 阅读
  4. 数据库设计之三范式

    2023-12-17 08:00:03       35 阅读
  5. 数据仓库】-- 数据库设计的三个范式

    2023-12-17 08:00:03       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-17 08:00:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-17 08:00:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-17 08:00:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-17 08:00:03       18 阅读

热门阅读

  1. 数据类型转换(js的问题)

    2023-12-17 08:00:03       40 阅读
  2. Flink系列之:SELECT & WHERE clause

    2023-12-17 08:00:03       37 阅读
  3. (C语言)精确计算程序运行时间的方法

    2023-12-17 08:00:03       40 阅读
  4. SpringBoot+OCR 实现PDF 内容识别

    2023-12-17 08:00:03       42 阅读
  5. UniGUI之提示信息MessageDlg及获得信息Prompt

    2023-12-17 08:00:03       41 阅读
  6. 7个精选的矢量数据库和搜索引擎项目

    2023-12-17 08:00:03       43 阅读
  7. Qt容器QToolBox工具箱

    2023-12-17 08:00:03       36 阅读
  8. es6 中的箭头函数和普通函数有什么区别?

    2023-12-17 08:00:03       31 阅读