数据库构建中的三范式设计(附SQL实例说明)

数据库构建中的三范式(附SQL实例说明)

设计数据库时遵循三范式(1NF、2NF、3NF)是关系型数据库设计中用于减少数据冗余、提高数据一致性的理论基础。

第一范式:任何一张表必须有主键,每个字段原子性不可再分;最核心的要求

第二范式:建立在第一范式基础之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖;

第三范式:建立在第二范式基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

个人总结:

多对多,三张表,关系表,两外键

一对多,两张表,多的表,加外键

一对一,外键唯一

以下通过代码示例来分别展示这三个范式的设计原则:

第一范式(1NF):原子性

问题表(非1NF)

CREATE TABLE Orders (OrderID INT PRIMARY KEY,CustomerName VARCHAR(100),CustomerAddress VARCHAR(255),OrderItems TEXT -- JSON格式存储多个订单项
);

在这个例子中,OrderItems列以JSON格式存储多个订单项,违反了1NF,因为一个字段包含了多个值(订单项列表),不具备原子性。

修正后的1NF表

CREATE TABLE Orders (OrderID INT PRIMARY KEY,CustomerID INT
);CREATE TABLE OrderItems (ItemID INT PRIMARY KEY,OrderID INT,ProductID INT,Quantity INT,Price DECIMAL(10, 2)
);CREATE TABLE Customers (CustomerID INT PRIMARY KEY,Name VARCHAR(100),Address VARCHAR(255)
);ALTER TABLE Orders ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
ALTER TABLE OrderItems ADD FOREIGN KEY (OrderID) REFERENCES Orders(OrderID);

现在,数据被分解成三个表:OrdersOrderItemsCustomers。每个表的每个字段都只包含一个不可再分的值,满足了第一范式的要求。

第二范式(2NF):消除部分依赖

问题表(非2NF)

CREATE TABLE CustomersOrders (CustomerID INT,OrderID INT,CustomerName VARCHAR(100),CustomerAddress VARCHAR(255),OrderDate DATE,PRIMARY KEY (CustomerID, OrderID)
);

此表中,CustomerNameCustomerAddress依赖于CustomerID,而不是整个主键(CustomerID, OrderID)。这意味着当一个顾客有多个订单时,这些顾客信息会被重复存储。

修正后的2NF表

CREATE TABLE Customers (CustomerID INT PRIMARY KEY,Name VARCHAR(100),Address VARCHAR(255)
);CREATE TABLE Orders (OrderID INT PRIMARY KEY,CustomerID INT,OrderDate DATE,FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

CustomersOrders表拆分为CustomersOrders两个表,每个表都具有单一主键,且非主键字段直接依赖于各自的主键,消除了部分依赖,符合第二范式。

第三范式(3NF):消除传递依赖

问题表(非3NF)

CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,Name VARCHAR(100),DepartmentID INT,DepartmentManagerID INT,ManagerName VARCHAR(100)
);

在此表中,ManagerName依赖于DepartmentManagerID,而DepartmentManagerID又依赖于DepartmentID。这种依赖关系是通过DepartmentID间接传递的,违反了第三范式。

修正后的3NF表

CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,Name VARCHAR(100),DepartmentID INT,FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);CREATE TABLE Departments (DepartmentID INT PRIMARY KEY,DepartmentManagerID INT,FOREIGN KEY (DepartmentManagerID) REFERENCES Employees(EmployeeID)
);CREATE TABLE Managers (ManagerID INT PRIMARY KEY,Name VARCHAR(100)
);ALTER TABLE Departments ADD FOREIGN KEY (DepartmentManagerID) REFERENCES Managers(ManagerID);

Employees表拆分为EmployeesDepartmentsManagers三个表。现在,每个非主键字段都直接依赖于各自表的主键,不存在通过其他非主键字段传递依赖的情况,符合第三范式。

通过上述代码示例,可以看到如何根据三范式的要求逐步对数据模型进行规范化设计,以减少冗余、增强数据一致性。在实际应用中,应根据业务需求和性能权衡,适当调整规范化程度,可能采用BCNF、第四范式(4NF)甚至反规范化(denormalization)等策略。

相关检索内容附上:

数据库的三范式是什么?-知乎

数据库设计之三大范式及举例说明-CSDN技术社区

数据库设计三范式_科技代码

数据库设计的三大范式(举例详解)-CSDN技术社区

数据库设计之三大范式-代码天地

数据库设计之三大范式-代码天地

关于数据库三大范式的理解-哔哩哔哩

了解更多知识请戳下:

@Author:懒羊羊

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

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

相关文章

玩转微服务-SonarQube

这里写目录标题 第一节 SonarQube1.1 简介1.2 四个组成部分1.2.1 SonarQube服务器1.2.2 SonarQube数据库1.2.3 插件1.2.4 Scanner 1.3 工作流程 第二节 SonarQube的安装2.1 安装2.2 插件 第三节 P3C规范3.1 简介3.2 SonarQube 配置 P3C规范3.3 IDEA配置 P3C规范 第四节 Maven项…

Mybatis-动态SQL

黑马程序员JavaWeb开发教程 文章目录 一、Mybatis-XML映射文件1、XML映射文件&#xff08;1&#xff09;规范&#xff08;2&#xff09;MybatisX 二、Mybatis-动态SQL-if1、动态SQL2、 标签<if><where>3、示例 三、Mybatis-动态SQL-foreach根据 id 批量删除员工1、…

iOS - 多线程-atomic

文章目录 iOS - 多线程-atomic1. 源码分析1.1 get方法1.2 set方法 2. 一般不使用atomic的原因 iOS - 多线程-atomic atomic用于保证属性setter、getter的原子性操作&#xff0c;相当于在getter和setter内部加了线程同步的锁可以参考源码objc4的objc-accessors.mm它并不能保证使…

刚刚,ChatGPT重大更新!GPT-4更加聪明,已成毕业论文撰写润色修改最佳利器!

今天ChatGPT Plus版本做了升级。GPT-4增强了记忆功能&#xff0c;能够通过你的多次对话了解你的意图&#xff0c;并提供合适的回应&#xff0c;总结一句话就是&#xff1a;更加懂你&#xff01; ChatGPT到底能干什么&#xff1f;我简单总结一下&#xff1a; 翻译&#xff1a;中…

电商技术揭秘三十一:智能风控与反欺诈技术

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

C++必修:从C到C++的过渡(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 缺省参数 1.1. 缺省参数的使用 缺省参数是声明或定义函数时为函数的参数指定…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

(Java)队列

一.概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a;进行删…

数据的正态性检验

正态性检验 判断 pd.Series 数据是否符合正态分布&#xff0c;可以采用以下几种方法。 计算偏度 偏度&#xff08;Skewness&#xff09;是衡量数据分布对称性的统计量。如果偏度大于 0&#xff0c;则数据分布是右偏的&#xff08;正偏斜&#xff09;&#xff1b;如果偏度小于…

时尚新选择,小塔RFID技术重塑样衣管理

在时尚领域&#xff0c;样衣是创意与工艺的完美结合&#xff0c;每一件都承载着设计师的心血与期待。然而&#xff0c;当这些珍贵的样版在传统的管理体系下流转时&#xff0c;样版管理成为一个令人头疼的问题。手动记录、盘点和样板追溯成为常态&#xff0c;但这种方式容易出错…

Web前端开发之HTML_1

第一个前端程序VS Code安装VS Code 快捷键 1. 第一个前端程序 使用记事本&#xff0c;新建一个文本文档&#xff0c;重命名为Welcome.html&#xff0c;如下图&#xff1a; 用记事本打开文档&#xff0c;内容输入如下&#xff1a; <html> <head> <t…

深度学习| 注意力机制

注意力机制 为什么需要注意力机制Seq2Seq问题Transfomer Attention注意力机制分类软硬注意力注意力域 为什么需要注意力机制 这个可以从NLP的Seq2Seq问题来慢慢理解。 Seq2Seq问题 Seq2Seq&#xff08;Sequence to Sequence&#xff09;&#xff1a;早期很多模型中&#xff…

数据赋能(67)——概念:数据变现

数据变现是指通过某种方式将数据转化为实际的收益或绩效。数据变现的方式多种多样&#xff0c;可以根据不同的应用场景和业务需求进行选择和组合。 数据变现的主要方式如下&#xff1a; 数据销售与租赁 组织直接出售原始数据或经过处理、整合后的数据给需要的组织或个人。组织…

Redis分布式锁 - 基于Jedis和LUA的分布式锁

先基于单机模式&#xff0c;基于Jedis手工造轮子实现自己的分布式锁。 首先看两个命令&#xff1a; Redis 分布式锁机制&#xff0c;主要借助 setnx 和 expire 两个命令完成。 setnx命令: setnx 是 set if not exists 的简写。将 key 的值设为 value &#xff0c;当且仅当…

uniapp问题归类

最近使用uniapp中&#xff0c;遇到了一些问题&#xff0c;这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了&#xff0c;最后看了下官方建议使用9.png图 生成9.png地址&#xff0c;推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…

【Linux驱动层】iTOP-RK3568学习之路(四):杂项设备驱动框架

一、杂项设备驱动简介 在 Linux 中&#xff0c;把无法归类的五花八门的设备定义成杂项设备。相较于字符设备&#xff0c;杂项设备有以下两个优点: (1)节省主设备号:杂项设备的主设备号固定为 10&#xff0c;而字符设备不管是动态分配还是静态分配设备号&#xff0c;都会消耗一…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Golang | Leetcode Golang题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; func rotate(matrix [][]int) {n : len(matrix)// 水平翻转for i : 0; i < n/2; i {matrix[i], matrix[n-1-i] matrix[n-1-i], matrix[i]}// 主对角线翻转for i : 0; i < n; i {for j : 0; j < i; j {matrix[i][j], matrix[j][i]…

Nuxt3项目如何通过开启ssr让网页实现seo自由!

nuxt.config开启ssr # nuxt.config.tsexport default defineNuxtConfig({// 是否开启SSRssr: true }) 终端运行 npm run generate generate 预渲染应用程序的每个路由&#xff0c;并将结果存储为纯HTML文件。 "scripts": {"generate": "nuxt genera…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段&#xff1a;创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说&#xff0c;发布版本的创建都需要一定的时间&#xff0c;其具体过程因各公司或组…