为学号,课程名称列定义主键约束,即一个学生只能选相同的课程一次 看看数据
存在数据冗余 插入一门新课试试
由于主键约束的存在,在没有学生选择这门课时无法将新课程插入到表中
更新了2行数据,数据越多,同时更新的也就越多,可看出和数据冗余有很大联系
有时需要反范式
符合第一范式
将上个表拆成两个表,即符合第二范式
上面的study学生信息表,学号可以确定学院,而学院地址又与学院有关系,所以学院地址和学号传递依赖关系,所以对其拆分符合第三范式
学生表数据
学生信息表
学院信息表
需求说明
需求分析及逻辑设计,设定用户名为主键
分析
一本书可能在多个分类中,所以联合主键商品名称和分类名称,不符合第二范式,所以拆分
只有一个主键,满足三范式
需要拆分
对前面的案例进行反范式化改造
想查一个商品的信息,必须同时关联这三张表,而第三张表更是几乎每次查询都会用到确认某分类下某商品
所以对商品信息表反范式化即增加分类名称的冗余数据,为避免插入异常,保留分类信息表,这样不会发生丢失分类信息情况
订单表变换
只需查订单表,不再需要对四张表查询
由于冗余了用户手机号,商品价格在订单表和订单商品表冗余处理
优点看起来很完美,提高了写操作但是损失了读操作性能
image.png
原则
示例表
示例表数据
看出计算不准确
一种精确地实数类型
看出计算精确
定义的宽度是字符单位,存储才是字节单位
varchar类型存储特点
varchar长度选择
适用场景
存储特点
适用场景,身份证性别等
最通用时间类型
设置时区-第十时区
建表
TIMESTAMP时间随时区变化
表数据
建表
只有第二列自动更新时间,默认只有第一个TIMESTAMP列自动更新
MySQL5.7前存储时间可选方式
MySQL5.7后date,time类型横空出世
image.png
后者不仅实质是int,而且也是时间戳
第三条以前两条为基准