数据库设计的三大范式(举例详解)

2023-10-29

 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就被称为范式。范式是符合某一种设计要求的总结。因此要设计一个结构合理的关系型数据库,就必须要满足下面这三大范式。

1NF (不可再分)

 1NF要求数据库的表中不能有可以被继续拆分的列,即表中的每一个属性field都具有原子性。

使数据库满足1NF的方法就是拆分列

• 不满足1NF:

姓名 班级
张三 计科1903

原因分析:

这一张表实际上就不满足1NF,因为班级这列是可以继续被拆分的。

• 满足1NF:

姓名 专业 班号
张三 计科 1903

1NF一般情况下都不会违背。

2NF (消除部分依赖)

 2NF指,在存在主键时,不能有部分依赖。(主要针对复合主键的)

 部分依赖: 一些非主属性依赖于主键的一部分,而不是主键的全部。

使数据库满足2NF的方法是拆分表。

• 不满足2NF:

订单编号 商品编号 商品名称 商品数量 商品价格 客户姓名 客户电话
0001 1 面包 10 $5 张三 130-2483-4321
0001 2 火腿 20 $3 张三 130-2483-4321
0002 2 火腿 5 $3 李四 155-1341-4521

原因分析:

表中选用(订单编号, 商品编号)联合作为联合主键

但是我们发现,不是所有属性字段都完全依赖联合主键的,它们或许只依赖主键中的一部分,这种部分依赖的关系是不满足2NF的!

这里的例子中,商品名称、商品价格这两个字段都是只依赖于(商品编号)这个字段的,也就是说它们只依赖于联合主键中的一部分。因此我们需要进行拆表!

• 满足2NF:

1.订单信息表

订单编号 客户姓名 客户电话
0001 张三 130-2483-4321
0002 李四 155-1341-4521

2.订单商品数量表

订单编号 商品编号 商品数量
0001 1 10
0001 2 20
0002 2 5

(商品数量是同时依赖于订单编号和商品编号的, 在这个表中,订单编号和商品编号仍然是作为联合主键)

3.商品信息表

商品编号 商品名称 商品价格
1 面包 $5
2 火腿 $3

3NF (消除间接依赖)

 3NF是需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

• 不满足3NF:

学号 姓名 课程号 课程名称
13002 张三 100 语文

原因分析:

这里主键是"学号"。

直接依赖于"学号"的有"姓名"和"课程号"。

“课程名称"直接依赖于"课程号”,间接依赖于"学号"。

因此,我们需要为课程号和课程名称单独创建一个表出来,下面是结果。

• 满足3NF:

1.学生表

学号 姓名 课程号
13002 张三 100

2.课程表

课程号 课程名称
100 语文
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库设计的三大范式(举例详解) 的相关文章

  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • NHibernate - 无法执行查询 - 输入字符串的格式不正确

    我已经为此摸不着头脑有一段时间了 我不知道出了什么问题 概述 我的 MySQL 数据库中有两个表 两者都正确映射到数据库 我可以加载数据 并且我能够查询一个表 但不能查询另一个表 我研究过的解决方案 表和 C 代码之间的类型转换问题 映射问
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • 处理与不同相关实体的一对多的正确模式

    我有一个 C 项目 我使用实体框架作为 ORM 我有一个User 可以向多家银行付款 每家银行都是一个独立的实体 并且每家银行都由不同的字段描述 问题是 一User可以没有或有很多不同的Banks 我不太确定如何对此进行建模 临时解决方案是
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • SQL:如何从一个表中获取另一个表中每一行的随机行数

    我有两个数据不相关的表 对于表 A 中的每一行 我想要例如表 B 中的 3 个随机行 使用光标这相当容易 但速度非常慢 那么我该如何用单个语句来表达这一点以避免 RBAR 呢 要获得 0 到 N 1 之间的随机数 可以使用 abs chec
  • SQL Server 查询中 UNION ALL 与 OR 条件

    我必须根据表上不存在的条件选择一些行 如果我使用如下的 union all 它会在不到 1 秒的时间内执行 SELECT 1 FROM dummyTable WHERE NOT EXISTS SELECT 1 FROM TABLE t WH
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

    我不想仅仅为了在 STIntersect 中返回 true 而将地理数据转换为几何图形 下面是 SQL 中的代码 DECLARE point GEOGRAPHY GEOGRAPHY Point 1 1 4326 DECLARE polygo

随机推荐

  • 记录第一次部署streamlit应用

    网上相关教程很多 经过多方尝试 记录自己成功的方法 一 通过git将项目文件上传至github 参考教程 23条消息 部署项目到github Gao 的博客 CSDN博客 github部署项目 二 添加requirements 部署在Str
  • 计算机主机mac地址怎么查,怎么查看电脑的Mac地址

    第一种方法 利用dos命令查看Mac地址 1 点击 开始 菜单 在 搜索程序和文件 输入框 输入 cmd 会找到进入dos命令的cmd程序 然后回车 快捷方式 WIN R 在输入cmd 2 回车后 弹出命令符窗口 输入 ipconfig a
  • 技术积累 — Ellisys软件及抓包器用户使用指南

    一 前言 Ellisys号称是业界最先进的蓝牙 Wi Fi USB协议分析仪 支持低功耗蓝牙协议分析测试 支持蓝牙5低功耗以及Wi Fi的物联网应用 支持与原始频谱 UART SPI HCI 逻辑信号等同步的宽带蓝牙5低能耗BLE Wi F
  • [Linux]-进程间通信之消息队列

    目录 消息队列的概述 消息队列的API 1 获取系统唯一Key值 IPC键值 2 创建消息队列 2 1查看消息队列的一些Linux命令 2 2消息队列的创建 3 消息的发送以及定义 3 1 通过消息队列发送信息 4 信息的接收 5 通过消息
  • Codeforces Round #660 (Div. 2)1388C - Uncle Bogdan and Country Happiness (好题,条件判断,DFS)

    题目大意 国家有N个城市 1号城市为首都 有M个国民 每个国民都在首都工作 晚上返回家中 给定每个城市有多少国民居住 每个城市都有一个心情检测器 当国民经过城市时 心情检测器根据国民的心情加减1 但是心情检测器并不精确 所以要求你去判断在所
  • 汽车电子相关术语

    SOA SOA Service Oriented Architecture 面向服务的架构 是一种在计算机环境中设计 开发 部署和管理离散模型的方法 是由Garnter1996年提出的概念 将应用程序的不同功能单元 称为服务 进行拆分 并通
  • NeRF论文翻译笔记

    分享 NeRF神经辐射场理解 深兰深延AI的博客 CSDN博客 神经辐射场 githubNeRF总结 https github com yenchenlin awesome NeRF 目录 摘要 1 介绍 2 相关工作 2 1 神经三维形状
  • ModuleNotFoundError: No module named 'exceptions'

    ModuleNotFoundError No module named exceptions 意味着你在你的代码中尝试使用了一个名为 exceptions 的模块 但是你的程序运行环境中找不到这个模块 这可能是因为这个模块没有安装 或者是你
  • MPC学习记录

    参考 无人驾驶车辆模型预测控制 第二版 第四章详细学习 算法部分 总系学不废的博客 CSDN博客 控制 模型预测控制MPC08 01总结修正 105664978 哔哩哔哩 bilibiliMPC 3 常用车辆模型 MATLAB 无人驾驶车辆
  • 用python计算工程量_使用python计算vintage

    coding utf 8 Created on Mon Jan 14 18 57 19 2019 author hinnc importnumpy as npimportpandas as pd from pandas tseries of
  • Python爬虫实战

    在本篇博客中 我们将使用Scrapy框架完成一个入门爬虫程序 在命令行创建scrapy项目 首先在命令行进入PyCharm的项目目录 然后执行 scrapy startproject 项目名 如ScrapyExample 生产爬虫项目 会自
  • eclipse如何安装server

    在eclipse中想添加配置server的是否 发现Preference目录里并没有Server这个选项 也就是说 我们并没有办法新建服务器 所以要安装一个server 1 eclipse help Install New Software
  • Java获取当前电脑的ip地址

    import java net Inet4Address import java net InetAddress import java net UnknownHostException author guochao version 1 0
  • 一文玩转pytorch转onnx-tensorRT ——(A)onnx转tensorRT

    说明 onnx和tensorRT是分开的 onnx像是prototxt和weight的打包在一起的东西 所以由onnx转到tensorRT下 还需要让onnx能搜索到 或parsing 所对应的层 caffeparsing有注册自定义层的函
  • C# 中的依赖注入模式

    依赖注入模式 DI 首先 依赖注入模式 是一种软件设计模式 它被称为 模式 因为它建议针对特定问题的低级特定实现 该模式旨在解决的主要问题是如何创建 松散耦合 的组件 它通过将组件的创建与其依赖项分开来实现这一点 此模式中有四个主要角色 类
  • Bitbucket入门手册

    老大要我去调研一下有什么好用的免费软件版本管理工具 有利于小团队开发的 我第一个想到的就是git 经常在git下东西 听说它的代码仓库好用 于是就注册了一个github的账号 创建仓库的时候才发现只能创建开源项目 私有仓库要收费 于是就在网
  • pyglet 绝对路径 相对路径

    加载绝对路径 加载 3D 模型文件 model path path to model obj model pyglet resource file model path import pyglet window pyglet window
  • 复现BART finetune历程

    复现BART finetune历程 准备 安装fairseq 使用fairseq官方提供的finetune代码 git clone https github com pytorch fairseq cd fairseq pip instal
  • 【科研论文】找到中文论文的英文引用格式

    引用 1 梁秀英 周风燃 陈欢 梁博 许锡晨 杨万能 基于运动恢复结构的玉米植株三维重建与性状提取 J 农业机械学报 2020 51 6 209 219 1 找到对应的期刊 基于运动恢复结构的玉米植株三维重建与性状提取 中国知网 2 打开期
  • 数据库设计的三大范式(举例详解)

    为了建立冗余较小 结构合理的数据库 设计数据库时必须遵循一定的规则 在关系型数据库中这种规则就被称为范式 范式是符合某一种设计要求的总结 因此要设计一个结构合理的关系型数据库 就必须要满足下面这三大范式 1NF 不可再分 1NF要求数据库的