文章目录
- 1. 数据库设计基本概念
- ① 什么叫关系?
- ② 什么叫行?
- ③ 什么叫列?
- ④ 什么叫表结构?
- ⑤ 为什么要提到实体和属性?
- ⑥ 为什么有时候会在两张不同的表里建立重复的字段?
- ⑦ 为什么有时候会故意设计一些冗余字段?
- ⑧ 什么叫保证数据完整性?
- 2. 实体和实体之间的关系
- 3. Codd第一范式:确保每列原子性
- 4. Codd 第二范式:非键字段必须依赖于键字段
- 5. Codd第三范式:消除传递依赖
- 补充
- 6. 内容出处
1. 数据库设计基本概念
① 什么叫关系?
你这张表里有stu_id,我这张表里也有stu_id,那么我们这两张表就建立了关系。可以通过创建主键、外键将两张表联合在一起,就算没有外键这两张表也可以确定关系。
mysql就是典型的关系型数据库。关系型数据库就是通过两张表的共有字段去确定数据的完整性。
② 什么叫行?
行就是一条数据记录(高级点的说法:一个实体)
③ 什么叫列?
列就是一个字段(高级点的说法:一个属性)
④ 什么叫表结构?
表结构:对于字段而言:我们说行、列
对于数据而言:我们说字段、记录(数据)
① 输入desc + 表名;以后就可以看到该表的结构状况(字段、数据类型、是否为空、key、default、extra等)
② 输入 select * from 表名; 以后看到的也是该表的结构状况(字段、数据)
⑤ 为什么要提到实体和属性?
这是根据面向对象语言(OOP)来的,可以联想一下Java里的实体和属性
⑥ 为什么有时候会在两张不同的表里建立重复的字段?
例如:上述学生表和食堂表里都有stuId,且该字段的数据是相同的。设想一下,如果食堂表里没有stuId会出现什么情况?无法查询某位学生在食堂的消费记录 – 这就是原因
⑦ 为什么有时候会故意设计一些冗余字段?
例如:高考成绩会列出各个科目的单科成绩,我们根据单科成绩就可以计算出总分,为什么还要单列总分这个字段?
这个字段看似没有必要设计,但是有时候我们需要考虑到并发操作。高考查成绩的人数非常多,虽然增加总分这个字段会消耗一定的性能,但是也可以在一定程度上提高查询效率。
数据冗余:只可能减少,不可能杜绝。减少数据冗余的方法:分表
⑧ 什么叫保证数据完整性?
选择的数据类型、数据范围正确
第7点
2. 实体和实体之间的关系
实体与实体之间的关系(简单来说就是一条数据记录与一条数据记录之间的关系):一对一、一对多、多对多、多对一
(一对多的例子:一个学生有好多条餐厅的消费记录)
可以结合数学函数中的对应关系来理解
3. Codd第一范式:确保每列原子性
即确保字段的原子性:确保每列的字段不可再分
例如:
① 字段(课程起止时间)就是可再分的,可以分成开始时间和结束时间
② 字段(money、age等)就是不可再分的
注意:有时我们需要根据项目来决定是否继续划分字段。需要统计数据时就拆分,不需要统计就不拆分
例如:
① 如果要统计各个地区(各个市)的人数,此时就需要划分
② 如果要收集某班学生的家庭住址,此时某个字段的值就可以填写成xx省xx市xx县xx,不需要继续划分该字段
4. Codd 第二范式:非键字段必须依赖于键字段
简单来说就是一张表只能描述一件事,说白了就是别没事找事
例如:stu这张表就是存储学生基本信息的,eatery这张表就是存储学生在餐厅的消费记录的。不能说我在stu这张表里再加一个字段money存储学生这个月有多少零花钱、加一个字段course存储学生这学期修了什么课,这就乱套了。
5. Codd第三范式:消除传递依赖
简单来说就是多余字段要尽可能删除
例如:高考成绩有了各科成绩就可以直接确定总分,sql语句查的时候或者代码里写上各科成绩查出来以后直接相加然后返还给用户就可以了,没必要设计总分这个多余的字段。虽然高考成绩此处的总分不能删除,但是其它时候需要考虑一下是否删除总分这个字段。
补充
数据库一共有六个范式,我们应该尽可能去遵守。可是事实上,我们能用三种就不错了。
6. 内容出处
mysql