数据库
数据库设计
三范式
数据库表设计时,我们往往需要遵守数据库设计的三范式,即使有时候个别情况不会遵守到第三范式,但是第一和第二都是为了数据库的结构和对表的读取而要去严格遵守的。
第一范式:字段的原子性
就是数据库表中的所有字段值都是不可分解的原子值
需要根据实际需求来顶,比如数据库系统中用到“address”--”地址“属性,原本我们可以直接根据地址建一个字段,但是地址里面会是省份、城市、乡镇、村,所以我们需要对地址这个字段进行拆分,保证每一个字段的原子性。
单从宏观来讲,关系型数据库,默认满足第一范式。
在一对多的设计中使用逗号分隔多个外键,虽然方便,但是不利于维护和索引,阿里巴巴开发手册上是在项目应用中强制规定不得使用外键的级联,一切外键概念必须在应用层中解决。像外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
第二范式:消除对主键的部份依赖
就是 在表中加上一个与业务逻辑无关的字段为主键
主键:可以唯一表示记录的字段或者字段集合
依赖:A字段可以确定B字段,则B字段依赖A字段
比如知道下一节课是数学,就能确定任课老师,于是 周几和**下一节课 **就能构成复合主键,能够确定去那个教室上课,任课老师是谁等。但我们经常增加一个id 作为主键,而消除对主键的依赖
对主键的部份依赖:某个字段依赖复合主键中的一部分
解决方案:新增一个独立字段作为主键
第三范式:消除对主键的传递依赖
传递依赖:B字段依赖于A, C字段又依赖于B。
任课老师是谁取决于是什么课,是什么课又取决于主键id。因此需要将此表拆分为两张表 日程表和课程表 (独立数据独立建表) :
id | weekday | course_address | course_id |
---|---|---|---|
1001 | 周一 | 11号教学楼 | 14252 |
course_id | course_name | course_name |
---|---|---|
14252 | math | 杨老师 |
这样就减少了数据的冗余(即使周一至周日每天都有 math 课,也只是course_id:14252 出现了7次)
后续
现在对此的理解还没有理解透,有新的理解了再来更i新. . . . . .