MySQL数据库设计

1. 如何设计数据库

        设计数据库步骤

2. E-R图的使用

我们在日常设计的数据库多为“一对多”和“多对一”

3. 设计数据库三大范式⭐

        第一范式(1st NF):确保每列的原子性

        第二范式(2st NF):每个表只描述一件事情

        第三范式 (3nd NF):表中各列必须和主键直接相关,不能间接相关

4. 三大范式补充

1. 第一范式(1NF)

核心要求‌:确保每列具有原子性,即不可再分。

  • 通俗理解‌:表中的每个字段必须是不可分割的最小数据单元,不能包含集合、数组或复合结构。例如,“地址”字段若包含省份、城市、街道等信息,需拆分为多个独立字段。
  • 示例‌:若“家庭信息”列包含“地址+成员”,需拆分为“地址”和“家庭成员”两列以满足1NF。

2. 第二范式(2NF)

核心要求‌:在1NF基础上,非主键属性必须完全依赖于主键(而非部分依赖)。

  • 联合主键场景‌:若主键由多列组成(如订单号+产品号),非主键字段(如产品价格)必须依赖整个主键,而非仅依赖产品号。
  • 违反示例‌:订单表中“订单日期”仅依赖订单号(主键的一部分),需拆分表以消除部分依赖。

3. 第三范式(3NF)

核心要求‌:在2NF基础上,消除非主键属性间的传递依赖。

  • 传递依赖问题‌:若字段A依赖字段B,而B依赖主键,则A应直接依赖主键。例如,订单表中不应直接存储客户姓名(依赖客户编号),应通过外键关联客户表。
  • 优点‌:减少数据冗余(如避免重复存储客户信息)并避免更新异常。

注意事项

  • 实际应用‌:三大范式虽规范,但可能影响查询性能。阿里巴巴建议关联表不超过3张,需平衡规范性与性能。
  • 更高范式‌:存在BCNF、4NF等,但1NF~3NF最常用。
  • 反范式设计‌:为提高查询效率,允许适度冗余(如统计字段),但需权衡数据一致性风险

5. 实际案例演示

        应用第一范式规范化

无可继续拆分的信息,无需应用

        应用第二范式规范化

        应用第三范式规范化

 

6. 反范式设计(补充说明)

一、基本概念

反范式设计是数据库设计中的一种优化手段,指在数据库建模过程中,通过适当违反范式规则(如增加冗余数据、合并表等),来提高数据库的读取性能。它是对范式设计(追求数据一致性和减少冗余)的一种权衡,适用于读取操作频繁、写入操作较少的场景。

二、核心思想
  • 牺牲部分一致性,换取查询效率:通过引入冗余数据或合并表,减少查询时的表连接(JOIN)操作,从而提升查询速度。
  • 平衡性能与维护成本:在数据冗余带来的查询优化和数据更新、维护成本之间寻找平衡点。
三、常见方法

以下是反范式设计的常用手段,可根据具体场景组合使用:

1. 增加冗余字段
  • 做法:在多个表中保留相同的字段,避免跨表查询。
    :订单表(Order)中包含用户姓名(User.Name),避免每次查询订单时 JOIN 用户表(User)。
  • 适用场景:冗余字段更新频率低,且查询时频繁需要关联的场景。
2. 合并表
  • 做法:将经常一起查询的多个表合并为一个表,减少 JOIN 操作。
    :将用户表(User)和用户详情表(UserDetail)合并为一个表。
  • 适用场景:表之间存在强关联,且合并后不会导致大量空字段的场景。
3. 拆分表
  • 垂直拆分:将表中不常用的字段拆分到单独的扩展表中,减少主表数据量,提升查询速度。
    :将用户表中的 “头像 URL”“简介” 等低频字段拆分到扩展表。
  • 水平拆分:按条件(如时间、ID 范围)将表数据拆分到多个子表中,降低单表数据量。
    :按年份将订单表拆分为Order_2023Order_2024等表。
4. 增加派生字段
  • 做法:通过计算或聚合生成新字段,直接存储结果,避免查询时实时计算。
    :在用户表中存储 “总订单数” 字段,通过定时任务更新,避免每次查询时统计。
四、适用场景

反范式设计适用于以下场景:

  1. 读多写少:如报表系统、日志系统、历史数据查询等。
  2. 实时性要求高:如电商商品详情页(需快速展示商品、分类、商家等信息)。
  3. 单表数据量庞大:当范式设计导致 JOIN 操作性能低下时,可通过冗余减少关联。
  4. 允许一定数据延迟:如允许冗余字段定期同步,而非实时更新。
五、优缺点分析
优点缺点
减少 JOIN 操作,提升查询性能数据冗余可能导致不一致(如更新延迟)
简化查询逻辑,降低开发复杂度增加数据维护成本(如更新、删除)
单表查询效率更高占用更多存储空间
对 OLAP(联机分析处理)场景友好设计不当可能导致后续扩展困难
六、实施注意事项
  1. 评估场景必要性:优先使用索引、缓存(如 Redis)等优化手段,避免过度反范式。
  2. 控制冗余程度:仅对高频查询且低更新的数据进行冗余,避免全表冗余。
  3. 数据一致性方案
    • 定期同步:通过定时任务(如 CRON)更新冗余数据。
    • 触发器:在写入主表时,通过数据库触发器同步更新冗余字段(需注意性能影响)。
    • 应用层控制:在业务代码中手动维护主表与冗余数据的一致性。
  4. 文档记录:明确标注反范式设计的字段和逻辑,方便后续维护。
  5. 监控与优化:定期分析查询性能和数据一致性,必要时调整设计。
七、与范式设计的对比
维度范式设计反范式设计
核心目标数据一致性、减少冗余读取性能优化
适用场景OLTP(联机事务处理)系统OLAP 系统、读多写少场景
典型场景银行交易系统、电商订单系统报表系统、商品详情页
设计复杂度高(需遵循范式规则)中(需平衡冗余与维护)
八、案例说明

场景:设计一个电商平台的 “商品详情页”,需展示商品信息、分类名称、商家名称。

  • 范式设计
    • 表结构:商品表(Goods)分类表(Category)商家表(Seller)
    • 查询:需 JOIN 三张表,性能可能较低(尤其在高并发场景)。
  • 反范式设计
    • 商品表中增加冗余字段category_name(分类名称)、seller_name(商家名称)。
    • 查询:直接单表查询,性能显著提升;通过定时任务或商品 / 分类 / 商家更新时同步冗余字段。
九、总结

反范式设计是数据库优化的重要手段,但需谨慎使用。关键在于明确业务需求,在性能提升与数据维护成本之间找到平衡点。实际应用中,常采用 “混合设计”—— 核心业务遵循范式设计,高频查询场景辅以反范式优化,以兼顾一致性和性能。

7. 总结

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

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

相关文章

C#中Action的用法

Action 是 C# 中委托的一种,用于封装无返回值的方法。它引用的方法不能有返回值,但可以有零个或多个参数。相比delegate委托,Action 委托的优点是不必显式定义封装无参数过程的委托,使代码更加简洁和易读。 1、delegate-委托 先…

计算机视觉与深度学习 | matlab实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 一、完整代码实现二、核心公式说明1. **经验模态分解(EMD)**2. **1D卷积运算**3. **LSTM门控机制**4. **损失函数**三、代码结构解析四、关键参数说明五、性能优化建议六、典型输出示例以下是用MATLAB实现EMD-CNN-LSTM时间序列预测的完整方案,包含数据生成、经…

mybatis-plus实操

如何生成完全看项目,有的人是用管理系统生成,还有其他人可能是.....。博主这里是用插件生成 我是插件的话,先在ide连接上数据源,然后对表右键,直接来到下面这个步骤, 第一次是新增6个文件,我们…

Mergekit——任务向量合并算法Ties解析

Mergekit——高频合并算法 TIES解析 Ties背景Ties 核心思想具体流程总结 mergekit项目地址 Mergekit提供模型合并方法可以概况为三大类:基本线性加权、基于球面插值、基于任务向量,今天我们来刷下基于任务向量的ties合并方法,熟悉原理和代码。…

YOLOv8 在单片机上部署的缺点和应对方案

YOLOv8 在单片机上部署的主要挑战与缺陷 将 YOLOv8 部署到单片机上确实面临诸多技术挑战,主要源于单片机有限的计算资源与 YOLOv8 模型的高复杂度之间的矛盾。以下是具体的缺陷和限制: 1. 计算资源严重不足 算力限制:典型单片机&#xff0…

搭建一个永久免费的博客

搭建永久免费的博客(1)基本介绍 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下载安装git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…

基于SpringBoot的小型民营加油站管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

推荐一个Winform开源的UI工具包

从零学习构建一个完整的系统 推荐一个开源、免费的适合.NET WinForms 控件的套件。 项目简介 Krypton是一套开源的.Net组件,用于快速构建具有丰富UI交互的WinForms应用程序。 丰富的UI控件,提供了48个基础控件,如按钮、文本框、标签、下拉…

社交平台推出IP关联机制:增强用户体验与网络安全的新举措

社交平台为我们提供与亲朋好友保持联系、分享生活点滴的便捷渠道,还成为了信息传播、观点交流的重要平台。然而,随着社交平台的普及,网络空间中的虚假信息、恶意行为等问题也日益凸显。为了应对这些挑战,许多社交平台相继推出IP关…

系统架构设计(八):三层架构

什么是三层架构(Three-Tier Architecture) 三层架构是将系统分为三大逻辑层:表示层(Presentation)、业务逻辑层(Business Logic)、数据访问层(Data Access),…

C语法备注01

(1)char 字符类 char 既可以是 整数 类型,也可以是 字符 类型。z字符 类型可以转化为对应的ASC2值。 int main(){char c;char e;c 1;char d 1;e A;printf("c %d\n", c);printf("d %d\n", d);printf("e %d\n…

CVE-2015-2183 Zeuscart SQL注入漏洞

CVE-2015-2183 Zeuscart SQL注入漏洞 主页 访问/admin/进行登录 访问:http://192.168.1.3/admin/?doeditcurrency&cid1 单引号测试,发现页面发生变化,进一步测试 order by 5 ,页面正常,order by 6时页面发生变…

Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装

Go语言即时通讯系统开发日志day2 计划:学习go中MySQL,Redis的使用,使用MySQL和Redis完成一个单聊demo。 总结:现在每天下午用来开发这个项目,如果有课的话可能学习时间只有3-4个小时,再加上今天的学习效率不…

对盒模型的理解

对CSS盒模型的深入理解 CSS盒模型是网页布局的基础概念,它描述了HTML元素在页面中所占的空间以及如何计算这些空间。以下是关于盒模型的全面解析: 1. 盒模型的基本组成 每个HTML元素都被视为一个矩形的盒子,这个盒子由内到外由四部分组成&…

RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据

通过代码的方式同时获取SMARTP模式的VENC码流数据和普通GOP模式的VENC码流数据,并进行对比画质。 一.RV1126 VI采集摄像头数据并同时编码SMARTP模式和普通GOP模式的编码码流流程 RV1126利用多线程同时获取普通GOP的VENC码流数据和SMARTP的码流数据一般如上图&#…

在Ubuntu使用 Ansible 配置 Azure 资源的动态清单

使用 Ansible 配置 Azure 资源的动态清单 简介1.安装pipx2.通过 pipx 安装 Ansible3.安装azure.azcollection4.安装集合所需的依赖项5.生成动态库存 简介 在主机变化不定的云环境中,Ansible 的动态清单功能可以消除维护静态清单文件的负担 本教程将带你使用 Azure…

车载诊断架构 ---车载总线对于功能寻址的处理策略

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

Github 2025-05-16 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2025-05-16统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Netty:异步事件驱动的网络应用程序框架 创建周期:5043 天开发语言:Java协议类型:Apache License 2.0Star数量:33219 个Fork数量:…

大语言模型(LLM)如何通过“思考时间”(即推理时的计算资源)提升推理能力

大语言模型(LLM)如何通过“思考时间”(即推理时的计算资源)提升推理能力 核心围绕人类思维机制、模型架构改进、训练方法优化等展开 一、人类思维的启发:快思考与慢思考 类比心理学: 人类思维分两种模式: 快思考(系统1):直觉驱动,快速但易出错(如估算简单问题)。…

【ubuntu24.04】pycharm 死机结束进程

windows 远程pycharm到ubuntu执行程序 pycharm 在调试过程中,内存耗尽,然后死机了 pycharm 进程 (base) rootk8s-master-pfsrv:/home/zhangbin/下载# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …