DDL——三范式与表约束

news2025/1/12 23:37:20

目录

一、三大范式

1.范式的定义

2.第一范式

3.第二范式

4.第三范式

二、表约束 

1.约束的定义

2.非空约束(not null)

3.唯一性约束(unique)

4.主键约束(primary key)

5.外键约束(foreign key)


一、三大范式

1.范式的定义

为了建立冗余较小、结构合理的数据库,设计数据库时要遵循一定的规则,在关系型数据库中这个规则就叫做范式,范式包括:第一范式、第二范式、第三范式。

2.第一范式

每列都是原子性

  • 每一列的属性都是不可再分的,即保持原子性;
  • 两列属性相近或相似或一样,尽量合并属性一样的列,不产生冗余的数据
3.第二范式

在第一范式的基础上,属性完全依赖于主键(主键只有一个,具有标识性)

 确保表中的每一行数据只能和其中的一列相关,即每行数据只能做一件事。

如:

订单编号房间号联系人联系人电话身份证号
0011901张三123795315641235****2331
002 1902赵四137861479631235****1245
……
0051910张五129745615661235****2331

在这个表中,订单编号为主键。

当一个人这次订房用的张三的名字订了1901房,存在一个订单编号001;

这个人隔了几天再过来订房时,改了名字叫张五,换了新的手机号,订了1910房间,存在一个订单编号005;

当使用房间号进行查询时会出现对应的订单编号,不会出现冗余现象:一个订单号对应一个房间号;

当使用身份证号进行查询时,一个身份证号会对应两条数据,即:张三和张五,001订单号和005订单号,这时就出现了冗余,联系人是重复的,所以就需要把它拆开来

订单编号房间号联系人编号
00119011
002 19022
……
00519101
联系人编号联系人电话号码身份证号
1张三123795315641235****2331
2赵四137861479631235****1245
4.第三范式

在第二范式的基础上,属性直接依赖于主键,不存在传递依赖

传递函数: a-->b(b依赖于a)  b-->c(c依赖于b)则a-->c(c依赖于a)

例:Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

        学号--> 所在院校 --> (院校地址,院校电话)

        这样的表结构,我们应该拆开来,如下:

        (学号,姓名,年龄,性别,所在院校)和(所在院校,院校地址,院校电话)

总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。

如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结

构。所以不能一味的去追求范式建立数据库。

二、表约束 

1.约束的定义

约束就是表中数据的限制条件。约束包括:非空约束、唯一性约束、主键约束、外键约束、检查约束(目前MySQL不支持,Oracle支持)

2.非空约束(not null)

用not  null约束的字段不能为null值,必须给定具体数据

  • 一个表可以有很多列都限定非空
  • 不能组合为空
create table test1(
    sname varchar(20) not null,
    sage int
);
insert into test1(sage) vlaues(16);
#这里增加数据时,没有给不能为空的sname给值,MySQL会报错
3.唯一性约束(unique)

unique约束的字段,具有唯一性,不可重复,但可以为null。

  • 当创建唯一约束时,不给唯一约束起名,则会默认和列名相同
  • 可以多个列组合的值唯一
create table test1(
    sname varchar(20) not null,
    sage int,
    email varchar(128) unique
);
insert into test1 vlaues("张三",10,"zhangsan@qq.com");
insert into test1 vlaues("张三",10,"zhangsan@qq.com");
#这里增加数据时,插入相同的两个邮箱,MySQL会报错

#表级约束
create table test1(
    sname varchar(20) not null,
    sage int,
    email varchar(128),
    unique(email)
);
create table test1(
    sname varchar(20) not null,
    sage int,
    email varchar(128),
    sid int,
    unique(email,int)
);
#表示两个或两个以上字段同时与另一条记录相等,则报错

#给表级约束起名
create table test1(
    sname varchar(20) not null,
    sage int,
    email varchar(128),
    sid int,
    constraint em_id_unique unique(email,int)
);
4.主键约束(primary key)

主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值。

主键约束与“not null unique”区别

1、作为Primary Key的域/域组不能为null,而Unique Key可以。

2、在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。

3、更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置

Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。

一张表应该有主键字段,如果没有,表示该表无效

主键值:是当前行数据的唯一标识、是当前行数据的身份证号

即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

按主键约束的字段数量分类
无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)

复合主键(表级定义)

 在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动

生成,自增数从1开始,以1递增(auto_increment)。

5.外键约束(foreign key)

外键的定义:外键用于与另一张表的关联,是能够确定另一种表记录的字段,用于保持数据的一致性。

若有两个表A、B,id是A的主键,而B中也有字段id,则id就是表B的外键。

A为基本表或父表,B为信息表/子表/副表。

只能是表级定义

foreign key(表的字段名) references 父表表名(父表的字段名)

某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
按外键约束的字段数量分类
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
注意:
一张表可以有多个外键字段(与主键不同)
外键值可以为null
外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
有了外键引用之后,表分为父表和子表

班级表:父表
学生表:子表
创建先创建父表
删除先删除子表数据
插入先插入父表数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可集成多模型的机器人开发框架 dora:让机器人编程走向大众

作者 | Annie Xu 责编 | 何苗 出品 | GOSIM 开源创新汇 C 和 C是机器人编程中常用的编程语言,但学起来存在一定难度。那些对机器人感兴趣,但没有精力花费数周时间学习 C 和 C编程的用户只能望而却步。 为了让机器人技术变得更简单,陶海轩&a…

AWS SAM CLI 备忘单!

安装 AWS SAM CLI brew tap aws/tap brew 安装 aws-sam-cli 验证安装 $ sam --version 升级 SAM $ brew upgrade aws-sam-cli 您需要 AWS 凭证才能在 AWS 上工作。 构建并部署简单应用程序 $ sam init→ 下载示例应用程序 $ sam build→ 构建您的应用程序 $ sam deploy --guid…

机器学习:决策树回归树实现

1、决策树: 是一种树形结构,用于通过一系列的是非问题来预测目标值。在决策树回归中,树的叶子节点代表预测的连续值。 2、数据准备: 收集数据集,并对其进行清洗和预处理。 将数据集分为特征(X)…

git-20240822

目录 初始化仓库 Git init Git init project --bare 查看提交的记录 git log --prettyoneline 查看当前git远程库地址 git remote -v 查看详细提交记录 git log 撤出暂存区的文件 git reset HEAD file(.代表全部文件) 提交数据到远程仓库 git config --global push.…

4.6算法之贪心_702:Crossing River

题目 702:Crossing River 总时间限制: 1000ms 内存限制: 65536kB 描述 A group of N people wishes to go across a river with only one boat, which can at most carry two persons. Therefore some sort of shuttle arrangement must be arranged in order to row the boat…

【TB作品】普中V2,数字时钟万年历显示,音乐闹钟,流水灯,Proteus仿真

文章目录 功能硬件原理图LCD1602独立按键LED灯ds1302蜂鸣器 引脚汇总按键功能code 功能 带闹钟和花样流水灯的LCD数显实时时钟设计(运用DS1302时钟模块,LCD显示,带万年历,时间到响音乐显示花样流水灯) 万年历显示 按…

禹神:三小时快速上手TypeScript,TS速通教程(上篇、中篇、下篇,3合1笔记),根据视频整理

TypeScript快速上手 📚一、TypeScript简介 1.TypeScript由微软开发,是其于JavaScript的一个扩展语言. 2.TypeScript包含了JavaScript的所有内容,即:TypeScript是JavaScript的超集 3.TypeScript增加了:静态奖型检查、接…

Win10安装ChatTTS-2024-cuda10.1

0x00 前言 ChatTTS是专门为对话场景设计的文本转语音模型,例如大语言助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。目前在huggingface中的开源版本为4万小时训练且未SFT的版本。 0x01 准备环境 版本操作系统Win1…

大模型参数高效微调技术总结

基础知识 最近,OpenAI推出的ChatGPT展现出了卓越的性能,引发了大规模语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面:模型参数规模大,训练数据规模大。以GPT3为例,GPT3的参数…

springboot集成redis之接口缓存

什么是redis的接口缓存? Redis的接口缓存是一种利用Redis这种内存数据库来存储接口(API)响应数据的技术,以提高应用程序的响应速度和性能。具体来说,当用户请求一个接口时,系统会首先检查Redis缓存中是否已…

windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。 一、通过菜单“项目”-“管理NuGet程序包”,下载相关包 二、安装 Microsof…

windows ssh launch Jenkins

一、 windows server2012 ssh launch jenkins 经过一系列测试验证发现,windows server2012始终无法launch到jenkins master。配置ssh之后 [08/21/24 10:08:03] [SSH] Opening SSH connection to 172.xx.xx.xx:18822. [08/21/24 10:08:03] [SSH] WARNING: SSH Host …

DBeaver连接GBase 8s数据库的步骤

最近在学习国产数据库GBase 8s。酷酷一顿操作后,发现自带的 dbaccess 不好用,然后尝试用DBeaver这种图形界面来尝试使用。 本次使用工具: 1、dbeaver-ce-24.1.4 2、GBase 8s Server 8.8 一、搭建环境,官方建议使用的是CentOS 7.3&…

vue 实现批量引入组件

批量引入组件 1.目录示例2.被引入组件示例3.全局注册方法3.1.require.context() 是什么3.2.require.context() 用法 4.使用全局注册方法5.使用 1.目录示例 2.被引入组件示例 注意&#xff1a;必须要有name <template><div>Hkmxdy</div> </template> &l…

【学习笔记】Day 21

一、进度概述 1、机器学习常识19-22&#xff0c;以及相关代码复现 二、详情 19、矩阵分解 矩阵分解是一个纯数学问题&#xff0c;但当给矩阵赋予现实意义后&#xff0c;矩阵分解就成为了使用数学应对机器学习问题的一类典型而巧妙的方法。 在线性回归分析中&#xff…

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储

CV每日论文--2024.7.25

1、Diffusion Models for Monocular Depth Estimation: Overcoming Challenging Conditions 中文标题&#xff1a;单目深度估计的扩散模型&#xff1a;克服具有挑战性的条件 简介&#xff1a;本文提出了一种新颖的方法,旨在解决单张图像深度估计任务中具有挑战性的、超出分布范…

java设计模式--结构型模式

结构性模式&#xff1a;适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09; 充当两个不兼容接口之间的桥梁&#xff0c;属于结构型设计模式。目的是将一个类的接口转换为另一个接口&am…

Numba加速计算(CPU + GPU + prange)

文章目录 加速方法&#xff1a;Numba、CuPy、PyTorch、PyCUDA、Dask、Rapids一、Numba简介二、Numba类型&#xff1a;CPU GPU三、项目实战 —— 数组的每个元素加23.1、使用 python - range 循环计算 —— &#xff08;时耗&#xff1a;137.37 秒&#xff09;3.2、使用 python…

天空卫士五载出海路:让国际数据安全舞台,有我们的身影

在全球化和“一带一路”倡议的推动下&#xff0c;中国企业正加速出海&#xff0c;探索新的增长机会。中国联通联合天空卫士等合作伙伴&#xff0c;推出“安全产业链联合出海计划”&#xff0c;旨在汇聚资源&#xff0c;打造国家级网络安全产业平台&#xff0c;推动出海业务的发…