【数据库设计】深入理解常见范式

第一范式(1NF):数据原子性奠基者

核心要求:字段不可再分,消除重复数据组

  • 设计哲学:建立数据存储的基本单元标准
  • 实现要点:
    1. 每个字段存储单一类型数据
    2. 消除横向重复(多值字段)
    3. 消除纵向重复(重复记录组)
  • 典型反例:存储"张三,李四,王五"的共享字段
  • 升级方法:
    -- 错误示范
    CREATE TABLE BadDesign (OrderID INT PRIMARY KEY,Items VARCHAR(200)  -- 存储多个商品信息
    );-- 符合1NF
    CREATE TABLE OrderItems (OrderID INT,ItemID INT,Quantity INT,PRIMARY KEY (OrderID, ItemID)
    );
    
第二范式(2NF):消除数据寄生关系

核心要求:消除非主属性对候选键的部分依赖

  • 设计哲学:确保数据实体的独立性
  • 关键验证:
    • 每个非主属性必须完全依赖所有候选键
    • 存在单字段主键时自动满足
  • 典型案例分析:
    -- 不符合2NF的表结构
    CREATE TABLE Sales (OrderID INT,ProductID INT,CustomerName VARCHAR(50),  -- 依赖OrderIDProductPrice DECIMAL,     -- 依赖ProductIDPRIMARY KEY (OrderID, ProductID)
    );
    
    解构方案:
    • 拆分为Orders表(OrderID, CustomerName)
    • Products表(ProductID, ProductPrice)
    • OrderDetails表(OrderID, ProductID, Quantity)
第三范式(3NF):切断传递依赖链

核心要求:消除非主属性间的传递依赖

  • 设计哲学:建立数据元素的直接关联
  • 依赖关系验证:
    • 不存在A→B→C的传递链
    • 所有非主属性直接依赖候选键
  • 典型改进案例:
    -- 不符合3NF的员工表
    CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,DepartmentID INT,DeptLocation VARCHAR(50)  -- 通过DepartmentID间接依赖
    );-- 符合3NF的拆分
    CREATE TABLE Departments (DepartmentID INT PRIMARY KEY,DeptLocation VARCHAR(50)
    );
    
BC范式(BCNF):候选键的绝对主权

核心要求:所有决定因素都必须是候选键

  • 设计哲学:建立绝对的主键权威
  • 与3NF的核心差异:
    • 3NF允许主属性决定其他属性
    • BCNF要求所有决定因素都是候选键
  • 经典案例解析:
    -- 不符合BCNF的课程表
    CREATE TABLE CourseReg (StudentID INT,CourseID INT,InstructorID INT,  -- 由CourseID决定PRIMARY KEY (StudentID, CourseID)
    );
    
    改进方案:
    CREATE TABLE CourseInstructor (CourseID INT PRIMARY KEY,InstructorID INT
    );CREATE TABLE StudentCourses (StudentID INT,CourseID INT,PRIMARY KEY (StudentID, CourseID)
    );
    
范式演进关系图示
非规范化表│▼ 消除重复组
1NF(原子性)│▼ 消除部分依赖
2NF(完全依赖)│▼ 消除传递依赖
3NF(直接依赖)│▼ 消除主属性依赖
BCNF(超键依赖)
实践权衡策略
  1. 存储优化:当读取频率远高于更新时,允许可控冗余
  2. 性能优先:在复杂查询场景保留计算字段
  3. 历史追溯:审计字段可不严格遵循范式
  4. 高频事务:支付系统建议至少达到3NF
  5. 分析系统:数据仓库可采用星型/雪花模型打破范式
范式验证流程图
开始↓
是否存在多值字段? → 是 → 违反1NF↓否
是否存在部分依赖? → 是 → 违反2NF↓否
是否存在传递依赖? → 是 → 违反3NF↓否
是否存在非候选键决定因素? → 是 → 违反BCNF↓否
符合BCNF规范

理解范式的关键是要把握每个范式要解决的具体问题:

  • 1NF 解决数据存储格式问题
  • 2NF 解决实体属性归属问题
  • 3NF 解决属性间间接依赖问题
  • BCNF 解决候选键的绝对性问题

实际数据库设计时,建议按照"3NF为基准,BCNF为目标,适当反范式优化"的原则进行设计。在OLTP系统中通常要求至少达到3NF,而在OLAP系统中可以适当放宽范式要求。每次范式升级都应该有明确要解决的数据异常问题,避免为范式而范式。

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

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

相关文章

Unity URP后处理在Game窗口不显示

摄像机勾选这个就可以了: 参考:UNITY3D URP与后处理,在game窗口不显示问题_unity urp 半透明材质game看不到-CSDN博客

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

C#02项目——Checked用法

知识点 本项目用到的知识点包括: checked。主要用来处理溢出错误 Try.Prarse。将数字的字符串表示形式转换为其等效的 32 位有符号整数。 返回值指示转换是否成功 public static bool TryParse (string? s, out int result);Try…Catch。用于捕捉异常&#xff0c…

WPF 设置宽度为 父容器 宽度的一半

方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

Windows 系统 GDAL库 配置到 Qt 上

在地理信息开发中广泛使用的开源库,GDAL(Geospatial Data Abstraction Library))库提供了读取和处理各种地理空间数据格式的能力。 准备阶段 下载 GDAL 库:前往 GDAL 的官方网站(https://www.gisinternals.com/)下载…

自己动手实现一个简单的Linux AI Agent

大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址: https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…

豆包MarsCode “一键Apply”功能测评:编程效率革新利器

本文 前言功能亮点1. 告别重复操作2. 精准问题解决3. 助力新项目开发4.代码快速切换5.注释快速生成,一键Apply直接粘贴 使用体验总结 本文正在参加豆包MarsCode上新Apply体验活动 前言 在当今快节奏的编程开发领域,效率无疑是开发者们追求的核心目标之一…

SpringBoot中的Javaconfig

为什么要使用Javaconfig? 如果要声明的bean对象,来自于第三方jar包(不是自定义的),无法使用Component 及衍生注解来声明bean,因为第三方的jar一般不可写,需要使用注解Configuration和Bean注解来…

ThinkPHP8视图赋值与渲染

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中,使用view函数可以传入视图…

笔记4——列表list

列表list list:一种有序的集合;可以随时添加和删除列表元素;可以包含不同数据类型 使用 【】 定义列表;元素之间用 , 分开 my_list [1,love,0.123,[1,2,3]] print(my_list)len() :获取元素个数;空列表…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴,数据管理系统无非就两个问题:数据怎么存、数据怎么算    现在的信息爆炸时代,一台服务器数据存不下,可以找10台服务器存储,10台存储不下,可以再找100台服务器存储。但是这1…

分布式 IO 模块:港口控制主柜的智能 “助手”

在繁忙的港口,每一个集装箱的装卸、每一艘货轮的停靠与离港,都离不开高效精准的控制系统。港口控制主柜作为整个港口作业的核心枢纽之一,其稳定运行至关重要。而明达技术自主研发推出的MR30分布式 IO 模块可作为从站,与 PLC&#…

Golang GORM系列:GORM 高级查询教程

有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包(称为GORM)除了标准的CRUD操作之外,还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据,甚至涉…

常见的数据仓库有哪些?

数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…

搜维尔科技在动作捕捉与动画制作、汽车制造与安全测试、机器人与自动化领域的一些案例

动作捕捉与动画制作领域 1.逼真的手部和面部动画制作:动画师施先生利用搜维尔科技代理的Xsens套装、Manus VR手套和Faceware的面部动作捕捉系统,捕捉短片中人物的手部和面部动作,再将数据重新定位到角色骨架上并调整,最终在虚幻引…

HTTP3原理解析和实战应用

http协议原理解析 HTTP1.1改动 keeplive 在http1.0版本中http连接会在每次请求都会发起连接, 并且每次连接在保证安全性都需要建立三次握手, 每次请求后就立即断开连接, 下次请求就还需要重新建立连接.这样就提升了请求的复杂度. keeplive就使得每次建立连接后可以多次请求…

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法(Lamport 算法)调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中,多个应用服务可能会同时…

VMware Windows_10_x64 安装 VM Tools 后无法将本机文件复制到虚拟机

有一种情况,安装VM Tools死活安装不上去。这时不要急不要慌,重启本机就好了(本人情况就是如此)。 windows键 R 输入 service.msc 打开服务管理器 找到Virtual Disk服务,选择属性设置为自动,应用后启用服…

uniapp 编译生成鸿蒙正式app步骤

1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…

AI+智能中台企业架构设计_重新定义制造(46页PPT)

本文档主要探讨了“中台”的概念及其在制造领域的应用,通过百度中台技术案例,展示了如何利用ABCIOT(人工智能、大数据、云计算和物联网)重新定义制造业。中台被定义为企业内部核心管理平台,包括微服务业务平台、组织创…