首页 > 数据库 >数据库三大范式

数据库三大范式

时间:2024-04-19 18:56:20浏览次数:14  
标签:范式 数据库 依赖于 订单 表中 主键 三大 属性

数据库三大范式

在数据库设计中,范式是一种规范化的设计方法,它可以帮助我们避免数据冗余和不一致性。目前,数据库中比较常用的范式有三种,分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。本文将介绍这三种范式,并举例说明。

1. 第一范式(1NF)

第一范式是最基本的范式,它要求关系中的每个属性都是原子性的,即不可再分。换句话说,每个属性都应该是一个单一的值,而不是多个值的组合。例如,一个学生表中的“姓名”属性应该是单一的值,而不是由姓和名组成的值。

2. 第二范式(2NF)

第二范式是在第一范式的基础上进一步规范化的范式。它要求关系表中的每个非主键属性都完全依赖于主键,而不是依赖于主键的一部分。例如,一个订单表中的“订单金额”属性应该依赖于订单号,而不是依赖于订单中的某个商品。

3. 第三范式(3NF)

第三范式是在第二范式的基础上进一步规范化的范式。它要求关系表中的每个非主键属性都不依赖于其他非主键属性。换句话说,每个非主键属性都应该直接依赖于主键。例如,一个学生表中的“年龄”属性应该直接依赖于学生的学号,而不是依赖于学生所在的班级。

区别

第二范式:2NF 设R为任一给定关系,若R为 1NF,且其所有非主属性都 完全函数依赖 于候选关键字,则R为 第二范式。

第一范式到第二范式的 过程:消除第一范式的 部分函数依赖 的过程。

第三范式:3NF 设R为任一给定关系,若R为 2NF,且其每一个非主属性都 不传递函数依赖 于候选关键字,则R为 第三范式。

第二范式到第三范式的 过程:消除第二范式的 传递函数依赖 的过程。

举例说明

假设有一个订单表,包含以下属性:订单号、客户号、客户姓名、商品号、商品名称、商品数量、商品单价、订单金额。该表的主键是订单号和商品号。

如果按照第一范式来设计该表,每个属性都应该是原子性的,即不可再分。因此,我们需要将客户姓名、商品名称和商品单价这些属性分别拆分成单独的属性。

如果按照第二范式来设计该表,我们需要保证每个非主键属性都完全依赖于主键。因此,我们需要将订单金额和商品数量属性从订单表中移除,并创建一个新的表来存储订单金额,该表的主键为订单号和商品号。

如果按照第三范式来设计该表,我们需要保证每个非主键属性都不依赖于其他非主键属性。因此,我们需要将客户姓名、商品名称和商品单价这些属性从订单表中移除,并创建新的表来存储这些属性。

标签:范式,数据库,依赖于,订单,表中,主键,三大,属性
From: https://www.cnblogs.com/bigleft/p/18146627

相关文章

  • 数据库的物化视图
    数据库的物化视图数据库的物化视图(MaterializedView)是一种预先计算和存储的查询结果集,可以提高查询性能和减少查询开销。与普通视图不同,物化视图是实际存储在磁盘上的表,而不是只是一个查询语句。物化视图可以在需要时更新,以保持其数据的实时性。优点提高查询性能:物化视图可以......
  • Mysql数据库插入Emoji,字符集设置utf8mb4
    字符集和校对规则字符集(CHARACTERSET)为字母和符号的集合。例如latin1(MySQL默认),utf8和utf8mb4等等…不同字符集的默认校对规则和1个字符最大支持的字节长度可能不一样。校对规则(COLLATE)为规定字符如何比较的指令。比如当我们SQL语句后面需要根据某个字段orde......
  • 在 .NET 中使用 Milvus 向量数据库 - .NET 博客
    在.NET中使用Milvus向量数据库-.NET博客爱咋咋地平常使用C#,Angular,工业自动化领域研发​关注他 1人赞同了该文章在.NET中使用Milvus向量数据库-.NET博客摘要学习如何开始使用Milvus向量数据库在.NET中管理嵌入向量,用于搜索......
  • MySQL数据库
    MySQL数据库一、数据库简洁1.1什么是数据库1.2表1.3数据类型​ 字符串类型​ 主键PrimaryKey[PK]一个表只能有一个主键,这个主键可能是一列或多列组成选取主键的时候,尽量最少选择列,主键列的值不更改。主键值无意义。主键由多列组成(最多就是两列),该逐渐称为复合主键1.4......
  • 如何使用 abp 创建 module 并应用单独的数据库迁移
    创建abp项目官方文档已经提供了非常详细的新建项目向导。参考:https://docs.abp.io/en/abp/latest/Getting-Started-Create-Solution?UI=Blazor&DB=EF&Tiered=YesCLI命令参考:https://docs.abp.io/en/abp/latest/CLI我们使用abpCLI创建一个新项目。我使用Blazor来开发前......
  • Qt6 连接 MySql数据库
    前言教程参考:http://t.csdnimg.cn/wKAk3Qt6是没有mysql驱动是要自己安装的,而且在Qt6是没有.pro文件,只能用cmake进行编译,特别的坑。我也是被坑惨了,还去傻乎乎地找.por文件,整了半天。必看这个教程是针对Qt6的,如果用的是Qt5,则不适用!在连接前要先安装Mysql,可以参考http://t......
  • 【面试准备】【SQL】数据库有哪些约束?
    数据库中的约束(constraints)是用来确保数据库中数据的准确性和可靠性的一种规则。以下是一些常见的数据库约束:PRIMARYKEY(主键):确保列的值是唯一的,并且不能为NULL。FOREIGNKEY(外键):用于在两个表之间建立链接,并确保引用的数据的完整性。UNIQUE(唯一):确保所有列的组合在表中是......
  • 数据库设计的必备小技巧
    前言对于后端开发人员来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。这里就跟大家分享一下数据库设计的一些小技巧!见名知意在数据库设......
  • DbMigrator迁移数据库报错:The ConnectionString property has not been initialized.
    问题执行.DbMigrator时报错:TheConnectionStringpropertyhasnotbeeninitialized.原因情况一DbContext中没有指定连接字符串解决方案情况二appsettings.json配置文件的属性没有设置为始终复制解决方案右键appsettings.json选择属性>复制到输出目录选择始终复制或......
  • 如何实现数据库数据到Abp vnext实体对象的同步?以及代码生成工具
    在采用了EFCore的CodeFirst方式下,如果你在数据库中直接添加了新表或存储过程,你需要在项目代码中手动反向工程这些数据库的更改,以保持CodeFirst的代码与数据库同步。这种情况可以通过如下两个步骤来实现:从现有数据库创建模型:使用EntityFrameworkCore的Scaffold-DbContext......