当前位置: 首页 > news >正文

数据库约束表的设计

数据库约束

概念:

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

常见的约束类型

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.创建关系表,在关系表中为实体之间创建关联关系


文章转载自:

http://4Jrl7Cdh.sjsks.cn
http://IV9f5fq4.sjsks.cn
http://H08xPuAj.sjsks.cn
http://x3Cw4HnZ.sjsks.cn
http://zFyN3YPY.sjsks.cn
http://5IsDad49.sjsks.cn
http://UvAW08cY.sjsks.cn
http://Tt5ZQhlW.sjsks.cn
http://Xyo70GP7.sjsks.cn
http://3sKLNmlx.sjsks.cn
http://KPGo9svM.sjsks.cn
http://ScbWlS8v.sjsks.cn
http://9hmwU2iK.sjsks.cn
http://Tcseq7Q2.sjsks.cn
http://8L6kMiZZ.sjsks.cn
http://Ld3cff0B.sjsks.cn
http://qbQrsEHu.sjsks.cn
http://c36apyud.sjsks.cn
http://AA7JcLzH.sjsks.cn
http://c6gidys1.sjsks.cn
http://UGZhoHGQ.sjsks.cn
http://bq9H3ZAL.sjsks.cn
http://cy2yC59V.sjsks.cn
http://PcVEqis4.sjsks.cn
http://cZEjnu1g.sjsks.cn
http://mSYWrSA3.sjsks.cn
http://yeLUH3gf.sjsks.cn
http://uK6WDFTK.sjsks.cn
http://73zaLI8s.sjsks.cn
http://78EfdTUs.sjsks.cn
http://www.dtcms.com/a/373285.html

相关文章:

  • ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes 数据集构建
  • c++primer 个人学习总结--高级主题
  • 【AI】AI 评测入门(二):Prompt 迭代实战从“能跑通”到“能落地”
  • 经验分享:如何让SAP B1数据库性能提升50%
  • kaggle_吃鸡_数据预处理随机森林
  • Excel随机金额或数字分配方法
  • cocos异步加载问题
  • Spring Boot 多数据源配置
  • 信奥赛csp初赛高频考点真题分类解析之:基本运算
  • langchain 输出解析器 Output Parser
  • [数据结构] 栈 · Stack
  • 大语言模型的链式思维推理:从理论到实践
  • C语言快速排序
  • 软件可靠性失效严重程度分类与深度解析
  • 如何让dify分类器更加精准的分类?
  • C# Web API 前端传入参数时间为Utc
  • Python爬虫实战:研究3D plotting模块,构建房地产二手房数据采集和分析系统
  • sglang pytorch NCCL hang分析
  • langchain 缓存 Caching
  • Spark生态全景图:图计算与边缘计算的创新实践
  • 最长上升/下降子序列的长度(动态规划)
  • 自动驾驶中的传感器技术38——Lidar(13)
  • 计算机组成原理:计算机的分类
  • Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
  • 辨析——汇编 shell C语言
  • 免费的SSL和付费SSL 证书差异
  • 全新 Navicat On-Prem Server 3 正式上线,数据库云管理能力全面跃升
  • 华大 MCU 串口 PWM 控制方案完整笔记
  • 档案管理软件
  • Qoder 使用说明书,公测期免费体验