数据库约束&&表的设计

发布于:2025-09-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

数据库约束

概念:

数据库约束是关系型数据库的一个重要功能,主要是保证数据的完整性,也可理解为数据的正确性(数据本身是否正确,关联关系是否正确)(一般是用在指定列上)

常见的约束类型

1.NOT NULL 

not null 非空约束,没有指定非空约束时,当前列可以为空,如果某一列定义为必填项,那么就可以使用not null (非空)约束

2.UNIQUE

unique唯一约束,保证某列的每行必须有唯一的值,比如说身份证号,学号

在KEY字段会显示UNI 注意NULL可以重复插入

3.DEFAULT

defalut默认约束,规定没有给列赋值时的默认值

注意虽然指定默认约束,但当我们手动指定这一列值为NULL时,插入值仍为NULL

4.PRIMARY KEY

primary key 主键约束 not null和unique 的结合,主键约束的列既是非空的也是唯一的 主键约束帮我们校验了非空和唯一,这两个校验虽然在写入数据时对效率有一定影响,但是与不做校验相比,这个性能消耗还是可以承担的(主键的后面的索引起到了非常重要的作用)

eg: id  bigint primary key auto_increasement(自增,让数据库自己帮我们维护主键的增长)

insert操作时,都会事先生成一个主键值,不管成功与否,主键值都会视为使用

主键值在数据表中有可能不连续

会为每台服务器都预先分配一区段的主键值

一个表中不允许有两个主键值,一个主键同时可以包含多个列(复合主键) ——在唯一校验时,只有复合主键中所有列都相同才被判定为相同

5.FOREIGN KEY

foreign key 外键约束 保证一个表中的数据匹配另一个表中的参照完整性,本质上也是一个校验的过程

表中某个列的值,必须是另一个表中的关键列或是唯一约束列的值,也就是当前表中值在另一个表中在另一个表中必须存在,且满足主键或唯一约束

语法: foreign key(字段名) references 主表(列)

通过外键约束,保证数据的完整性和关系的正确性

当子表中存在依赖主表的记录时,不允许删除主表中的记录,要删只能先删除子表记录,再删主表

6.CHECK

保证列中值符号指定的条件(在MYSQL8.0有效,MYSQL5.7无效)

check(要检查的列=‘A’or~=‘B’)

表的设计

类、实体、表之间的关系

OOA面向对象分析--》OOD面向对象设计——》OOP面向对象编程

1.从需求中分析获得类,类对应到数据库中的实体,实体在数据库表现为表,类中的属性对应着表中的字段

2.确定类与类之间的关系(一对一,一对多,多对多,没有关系)

3.使用SQL去创建具体表(设计表时会遵循一些规则,一般称之为三大范式)

范式描述的是数据关系模型,一对一关系,一对多关系,多对多关系

三大范式

第一范式1NF

关系型数据库的最基本的要求,不满足第一范式就不可以称之为关系型数据库 

表中的字段不可再进行拆分(可以继续拆分在关系型数据库中是绝对不允许的)

在自定义表的时候,对应到数据中的数据类型,每个字段都可以用一个数据类型表示,那么当前这个表就天然的满足第一范式

第二范式2NF

在满足第一范式的基本上,不存在非关键字段对任意候选键的部分函数依赖(存在于复合主键的情况下)

任意候选键:可以理解为主键,外键,没有主键时的唯一键

非关键字段:可以理解为非关键字段

部分函数依赖:对于由两个或多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么就说明它存在部分函数依赖

一个表中没有复合主键,这样的表天然满足第二范式

不满足第二范式可能出现的情况:

1.数据冗余        2.更新异常        3.插入异常        4.删除异常

第三范式3NF

在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖

第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题

实例之间的关系

1.一对一关系

比如登陆界面,一个实体是用户,一个是账号(登录名,密码)

在设计表时,先把实体之间的关系列出来

一对一关系,设计表时,两种方式(1.把所有信息全放在一张表中   2.创建两张表,分别记录,并将两张表进行关联)

2.一对多关系

常见于学生与班级的关系(一个学生只能存在于一个班级,一个班级可以有多个学生)

3.多对多关系

一个学生可以选修多门课程,一门课程可以选多个学生

1.分别创建实体表

2.创建关系表,在关系表中为实体之间创建关联关系


网站公告

今日签到

点亮在社区的每一天
去签到