数据库的设计规范(1)

article/2025/9/19 16:57:11

范 式

范式简介

在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

范式都包括哪些

目前关系型数据库有六种常见范式,按照范式级别,从低到高分别是:第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美 范式。

键和相关属性的概念

举例:

这里有两个表:

球员表(player) :球员编号 | 姓名 | 身份证号 | 年龄 | 球队编号

球队表(team) :球队编号 | 主教练 | 球队所在地

超键 :对于球员表来说,超键就是包括球员编号或者身份证号的任意组合,比如(球员编号) (球员编号,姓名)(身份证号,年龄)等。

候选键 :就是最小的超键,对于球员表来说,候选键就是(球员编号)或者(身份证号)。

主键 :我们自己选定,也就是从候选键中选择一个,比如(球员编号)。

外键 :球员表中的球队编号。

主属性 、 非主属性 :在球员表中,主属性是(球员编号)(身份证号),其他的属性(姓名) (年龄)(球队编号)都是非主属性。

第一范式(1st NF) 

举例1:

假设一家公司要存储员工的姓名和联系方式。它创建一个如下表:

该表不符合 1NF ,因为规则说“表的每个属性必须具有原子(单个)值”,lisi和zhaoliu员工的

emp_mobile 值违反了该规则。为了使表符合 1NF ,我们应该有如下表数据:

举例2:

user 表的设计不符合第一范式

其中,user_info字段为用户信息,可以进一步拆分成更小粒度的字段,不符合数据库设计对第一范式的 要求。将user_info拆分后如下: 

举例3: 

属性的原子性是 主观的 。例如,Employees关系中雇员姓名应当使用1个(fullname)、2个(firstname和lastname)还是3个(firstname、middlename和lastname)属性表示呢?答案取决于应用程序。如果应 用程序需要分别处理雇员的姓名部分(如:用于搜索目的),则有必要把它们分开。否则,不需要。

 第二范式(2nd NF)

举例1:

成绩表 (学号,课程号,成绩)关系中,(学号,课程号)可以决定成绩,但是学号不能决定成绩,课 程号也不能决定成绩,所以“(学号,课程号)→成绩”就是 完全依赖关系 。

举例2:

比赛表 player_game ,里面包含球员编号、姓名、年龄、比赛编号、比赛时间和比赛场地等属性,这 里候选键和主键都为(球员编号,比赛编号),我们可以通过候选键(或主键)来决定如下的关系:

(球员编号, 比赛编号) → (姓名, 年龄, 比赛时间, 比赛场地,得分)

但是这个数据表不满足第二范式,因为数据表中的字段之间还存在着如下的对应关系:  

 

(球员编号) → (姓名,年龄)(比赛编号) → (比赛时间, 比赛场地)

对于非主属性来说,并非完全依赖候选键。这样会产生怎样的问题呢?  

1. 数据冗余 :如果一个球员可以参加 m 场比赛,那么球员的姓名和年龄就重复了 m-1 次。一个比赛 也可能会有 n 个球员参加,比赛的时间和地点就重复了 n-1 次。

2. 插入异常 :如果我们想要添加一场新的比赛,但是这时还没有确定参加的球员都有谁,那么就没 法插入。

3. 删除异常 :如果我要删除某个球员编号,如果没有单独保存比赛表的话,就会同时把比赛信息删 除掉。

4. 更新异常 :如果我们调整了某个比赛的时间,那么数据表中所有这个比赛的时间都需要进行调 整,否则就会出现一场比赛时间不同的情况。

 为了避免出现上述的情况,我们可以把球员比赛表设计为下面的三张表。

这样的话,每张数据表都符合第二范式,也就避免了异常情况的发生。  

 1NF 告诉我们字段属性需要是原子性的,而 2NF 告诉我们一张表就是一个独立的对象,一张表只 表达一个意思。

举例3:

定义了一个名为 Orders 的关系,表示订单和订单行的信息:

违反了第二范式,因为有非主键属性仅依赖于候选键(或主键)的一部分。例如,可以仅通过orderid找 到订单的 orderdate,以及 customerid 和 companyname,而没有必要再去使用productid。  

修改:

Orders表和OrderDetails表如下,此时符合第二范式。

第三范式(3rd NF)  

举例1:

部门信息表 :每个部门有部门编号(dept_id)、部门名称、部门简介等信息。

员工信息表 :每个员工有员工编号、姓名、部门编号。

列出部门编号后就不能再将部门名称、部门简介 等与部门有关的信息再加入员工信息表中。 如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

举例2:  

商品类别名称依赖于商品类别编号,不符合第三范式。

  

举例3:  

球员player表 :球员编号、姓名、球队名称和球队主教练。现在,我们把属性之间的依赖关系画出 来,如下图所示:

你能看到球员编号决定了球队名称,同时球队名称决定了球队主教练,非主属性球队主教练就会传递依 赖于球员编号,因此不符合 3NF 的要求。 如果要达到 3NF 的要求,需要把数据表拆成下面这样:  

符合3NF后的数据模型通俗地讲,2NF和3NF通常以这句话概括:“每个非键属性依赖于键,依赖于 整个键,并且除了键别无他物”。  


http://chatgpt.dhexx.cn/article/ONEKMALp.shtml

相关文章

SQL Server数据库设计规范

数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求。数据库设计过程中命名规范很是重要,命名规范合理的设计能够…

数据库设计规范小节

数据库设计规范小节 为什么需要数据库设计 **我们在设计数据表的时候,要考虑很多问题。**比如: 用户都需要什么数据?需要在数据表中保存哪些数据?如何保证数据表中数据的正确性,当插入、删除、更新的时候该进行怎样的约束检查?如何降低…

数据库设计规范(详细)

数据规范化设计 一、数据规范化 仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构 Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构 这些范式是: 1、第一范式(1st NF -First Normal F…

数据库设计规范

注:部分参考来源于网络 1.命名规范 1.【强制】库的名称必须控制在32个字符以内,相关模块的表名与表名之间尽量提现join的关系,如user表和user_login表。 2.【强制】库的名称格式:业务系统名称_子系统名,同一模块使用…

数据库的设计规范

数据库的设计规范 一、为什么需要数据库设计二、范式2.1 范式简介2.2 范式都包括哪些2.3 键和相关属性的概念2.4 第一范式(1st NF)2.5 第二范式(2nd NF)2.6 第三范式(3rd NF)2.7 小结 三、反范式化3.1 概述…

kettle运行spoon.bat时找不到javaw文件(三种方法)

第一种:确定环境变量 此电脑右键-属性-高级系统设置-环境变量,查看jdk的变量名(我的叫JAVA_HOME) 编辑sqoop.bat, 将_PENTAHO_JAVA_HOME修改成JAVA_HOME 第二种: 修改内存 将1024、2048都改成521 第三种…

启动Kettle时报错找不到文件javaw.exe

kettle 安装过程中异常处理: kettle运行spoon.bat时找不到javaw文件 bug报错_zgrjddd的博客-CSDN博客_找不到javaw文章目录问题描述问题分析解决方法测试以下问题描述kettle运行spoon.bat时找不到javaw.exe文件问题分析说的是javaw.exe 文件,但是jdk安…

配置javaw.exe双击运行jar包

配置javaw.exe双击运行jar包 安装版JDK绿色版JDK绿色版配置方式上述配置中没有找到 javaw.exe 的特殊情况 安装版JDK 安装版JDK不用配置,在双击jar包的时候,选择Java SE平台的关联工具javaw.exe关联即可! 绿色版JDK 所谓绿色版,是指直接解压即用,不需要安装的JDK,可以使用先…

javaw.exe与java.exe_java.exe和javaw.exe的区别及使用方法

相同点:二者都是Java的虚拟机,用来执行Java程序 区别:javaw.exe运行程序时不会输出控制台信息,如果是双击打开jar文件的话(假设已经设置好了打开方式),那么根本就不会出现控制台窗口,主要用来运行带窗体的应…

java javaw javaws MC_java和 javaw 以及 javaws的區別

java ,javaw 和 javaws 的區別: 首先,所有的這些都是java的啟動裝置,java.exe經常使用,當使用命令行輸出到window的時候,會有java.exe進程,通過任務管理器可以看到。通常 我們執行一些小的java程序的時…

Windows找不到javaw

因为项目要升级,但却发现有这个问题,进不去 右键编辑 找到jdk路径 set pathD:\mcdev\jdk8\bin

64位java没有javaw.exe,2019-01-01 eclipse无法找到javaw.exe怎么处理

尝试启动Eclipse,弹出如下对话框“No Java virtual machine was found after searching the following location:”,貌似是找不到javaw.exe。 先整理下基础知识: 1. Java virtual machine:Java虚拟机,是运行所有Java程…

javaw.exe

1.问题的提出背景 安装完成Apache Tomcat6.0后验证是否安装成功,在浏览器地址框中输入:http://localhost:8080,出现下面的界面说明安装成功。 然而,每次都输入端口号8080很麻烦,所以想把端口8080改为80,这…

64位java没有javaw.exe_javaw.exe路径错误导致eclipse无法启动

错误如图: 原因: 在指定路径中没有找到javaw.exe或路径错误。 因为Eclipse启动时需要javaw.exe来启动。先查找path中各个目录以后,没有找到;就会查看固定地在eclipse的安装目录下查找。即:先找外面装了没有;若没有则找…

安装oracle提示javaw,为什么oracle 9i 安装时,setup exe javaw exe进程消失

Windows XP下安装Oracle9i问题二则 环境:WindowsXP 数据库:Oracle9i 问题一: 第一次在WindowsXP上安装Oracle9i就碰到如下错误: “您可能没有建立目录的适当权限或者磁盘已经没有空间,无法建立目录 c:....” 当时我的c…

java javac 以及 javaw

java javac 以及 javaw 1.javac2. java 和 javaw 1.javac 一个java程序运行的流程: 源码->编译(.java->.class)->运行(.class->启动jvm) javac 的目的就是编译 将.java变成.class 将高级编程语言变成字节码 字节码不…

java javaw 命令区别_java.exe和javaw.exe有什么区别

java.exe和javaw.exe有什么区别 java.exe和javaw.exe有什么区别? java.exe是运行class文件用的,即执行class文件。 而javaw.exe是干什么用的?参考我的: http://blog.csdn.net/ideality_hunter/article/details/51376006 ------javaw和java的区别,其他人的解释: http://bl…

java javaw 命令区别_java、javaw和javaws的区别

java、javaw和javaws的区别: 首先,所有的这些都是java的启动装置,java.exe经常使用,当使用命令行输出到window的时候,会有java.exe进程,通过任务管理器可以看到。通常 我们执行一些小的java程序的时候会有 java.exe进程在运行。javaw.exe对于我们也比较特殊,我们也能够通…

javaw java 区别_java和 javaw 及 javaws的区别解析

java ,javaw 和 javaws 的区别: 首先,所有的这些都是java的启动装置,java.exe经常使用,当使用命令行输出到window的时候,会有java.exe进程,通过任务管理器可以看到。通常 我们执行一些小的java程序的时候会…

mysql 命令行导入sql文件

1. 说明 有时候,使用navicat为MySQL导入sql文件时,会出现一些错误而导致数据无法导入成功,这时我们可以采用命令行的方式导入数据。以windows环境为例。 2. 步骤 a.数据表 b. 以命令行的方式登入mysql b.选择数据库进行导入 window…