DDL——三范式与表约束

2024-08-23 04:20
文章标签 ddl 范式 约束 与表

本文主要是介绍DDL——三范式与表约束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、三大范式

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约束
有了外键引用之后,表分为父表和子表

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

 

这篇关于DDL——三范式与表约束的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098340

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

(javaweb)mysql---DDL

一.数据模型,数据库操作 1.二维表:有行有列 2. 3.客户端连接数据库,发送sql语句给DBMS(数据库管理系统),DBMS创建--以文件夹显示 二.表结构操作--创建 database和schema含义一样。 这样就显示出了之前的内容。

创建表时添加约束

查询表中的约束信息: SHOW KEYS FROM 表名; 示例: 创建depts表包含department_id该列为主键自动增长,department_name列不允许重复,location_id列不允许有空值。 create table depts(department_id int primary key auto_increment,department_name varcha

非空约束(Not Null)

修改表添加非空约束 使用DDL语句添加非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL; 示例: 向emp表中的salary添加非空约束。 alter table emp modify salary float(8,2) not NULL; 删除非空约束 使用DDL语句删除非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NULL;

Llama 3.1大模型的预训练和后训练范式解析

Meta的Llama大型语言模型每次出新版本,都会是一大事件。前段时间他们不仅发布了3.1的一个超大型的405亿参数模型,还对之前的8亿和70亿参数的模型做了升级,让它们在MMLU测试中的表现更好了。 不同模型在MMLU基准测试中的表现 他们还出了一个92页的技术报告《Llama 3 Herd of Models》(https://arxiv.org/abs/2407.21783),里

设计表时的三大范式(MySQL)

设计表时的三大范式 什么是范式第一范式第二范式不满足第二范式的缺点数据冗余插入异常更新异常删除异常 第三范式 什么是范式 在表的设计中,范式是一种设计规范,用于更好的组织和管理数据。 设计数据表时的范式有第一范式1NF、第二范式2NF、第三范式3NF等等,一般满足三大范式即可 第一范式 第一范式规定:数据表中的字段不可以再次拆分 只有满足了第一范式,才称得上是关系型数据

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L