本文作者:小课lemon
本文来源:产品的技术小课(pm_it_course)
---BEGIN---
目录
1、数据库约束与常见操作
2、建表规范
ps:以下讲解均基于mysql语言。
数据库约束与常见操作
一、主键
我们知道,一个表由n行记录组成。
1、概述
关系表都有一个约束:每一行记录必须要有某个字段来唯一标识,
能唯一标记记录的字段,称为主键。
假设有一张学生表:t_student
上面这张表,id是主键,我们可以通过id来区分出每一个同学:
id=1是张三,id=2是李四,id=3是陈红
一个表必须要有主键。我们可以在建表的时候,用primary key标识。比如:
create table t_student ( id int, name varchar(10), primary key (id));
2、主键字段的选择
当表已经开始使用并录入数据后,最好不要再做更改了,因为表的主键可能已经在其他表里用做外键关联或者已经在业务逻辑中使用。
所以
定义主键最好不要使用业务字段
,业务字段发生变更的概率比较大,比如学生的手机号码、学生的身份证都是可能发生变化的。
我们可以使用默认的自增字段来做主键,比如student表的id。
也可以使用基于时间和空间生成的uuid来做主键,uuid一般是业务逻辑里面生成来动态插入数据表。
3、联合主键
主键可以使用多个字段来标记。但是不太建议使用。这样在以后处理表关系或者业务逻辑时,会增加复杂度。
二、外键
假设有一张学生表:t_student
还有一张班级表:t_class
我们已经能通过id来识别张三、李四。那么我们怎么识别张三属于哪个班级,李四属于哪个班级呢?这时我们可以使用
外键
。
在t_student表增加一列叫class_id来表示班级id。
我们通过关系:t_student.class_id=t_class.id可以看出,张三在1班,李四在4班,陈红在3班。
通过外键我们可以看出,这2张表是一个
1对多
的关系。这里的“多”指的是学生表,“1”指的是班级表,含义是一个学生只可以对应一个班级,但是一个班级可以对应多个学生。
那如果是
多对多
的关系该如何实现呢?假设有一张学生选修的课程表:t_course
一个学生可选修多门课程,一个课程也可以被多名学生选择学习。这是一个多对多的关系。
一般会通过一个
中间表
来实现。
我们建立一个中间表叫做:t_student_course
表里一般要存储2个表的主键,如上的course_id和student_id。从表中我们就可以看出,学生id=1的张三选修了两门课程,分别是数学和政治。学生id=2的李四也选修了两门课程,分别是数据和算法。
还剩下一种表关系是
1对1
的关系,假设还有一张学生信息明细表,存储的是学生更详细的信息的表:t_student_detail
我们可以看出,一个学生对应一个详细信息。但是如果t_student_detail表里面只有一个字段或者2个字段的话,根据业务情况,也可以把这些字段纳入到t_student表中。
其实上述的学生详细明细表的做法,是一个提升表查询效率的做法。当t_student表的数据量比较大的时候,而且查询学生信息可能往往只是那几个字段,就可以通过分表的方式去提升查询性能。
小结:
表之间的关系有3种,分别是1对1,1对多,多对多。1对1可以通过增加一个字段或者建立另一张表通过外键关联。1对多可以通过建立另一张表通过外键关联。而多对多可以通过建立一张中间表和其他2张表的外键关联。
三、索引
索引按用途可以分为2种,一种是用于提升查询速度的查询索引,另一种是约束唯一性作用的唯一索引。
1、查询索引
一张数据表中,可能有成千上万的数据,如果想提高查询速度,那么通过给字段创建索引是提高查询速度的一种方式。
如果t_student表中,name是经常要查询的字段,那我们可以给name创建一个索引。
ALTER TABLE t_student ADD INDEX idx_name (name)
2、唯一索引
唯一索引表示的是字段的值是唯一的。
比如学生的手机号码,身份证这些业务字段,都是唯一的,如果给这些字段加上唯一索引约束,那么当你往学生表里插入重复的手机号码或者身份证时,数据库就会报错阻止你的操作,起到保护数据唯一性的作用。
对单个字段添加唯一索引:mobile字段
ALTER TABLE t_student ADD UNIQUE INDEX uni_mobile (mobile);
对多个字段添加联合唯一索引:mobile和card_id字段
ALTER TABLE t_student ADD UNIQUE INDEX uni_mobile_card (mobile,card_id);
四、默认值
我们可以给字段设置默认值,但是默认值跟数据类型必须是匹配的。比如你是一个int整型,不能设置一个字符串类型的值。
比如设置时间字段的默认值为当前时间戳:
create table t_student ( create_time timestamp default current_timestamp );
五、NOT NULL 约束
null不是数据类型,它是列的一个属性。
null表示的是空,如果你不允许你的字段值为空,则添加not null约束
比如约束学生表的名字不能为空:
create table t_student (name VARCHAR(22) NOT NULL)
建表规范
建表三范式可能大家都知道。一般建表都要遵守三范式原则。
一、第一范式
要求有主键,并且要求每一个字段都遵守原子性不可再分。
二、第二范式
满足第一范式的前提下,要求所有非主键字段完全依赖主键,不能产生部分依赖。
举个例子:假设有一张学生表:t_student