news 2026/4/18 12:03:54

表的设计(mysql篇)怎么来设计表?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
表的设计(mysql篇)怎么来设计表?

前言:

表从何而来?

在进行编程时有这么一个过程:OOA面向对象分析-->OOD面向对象分析-->OOP面向对象编程,

而表的设计是针对OOA,

具体是怎么展开的呢?

1.从需求中获取类,类对应数据库中的实体,实体在数据库中表现为一张张表,类中的属性对应表中的字段。(也就是说类对应数据库中的表)

2.确定类和类之间的关系

3.使用sql来创建具体的表

设计表时要遵循一些规则我们称之为3大范式

一、认识范式

范式有三大规则:

(1)1NF:确保每列具有原子性(不可再分)

(2)2NF:在满足1NF的前提下,非主键列完全依赖于主键

(3)3NF:在满足2NF的前提下,消除传递依赖

(相应规则后续有讲解)

数据库表之间也有三大关系:一对一,一对多,多对多,

总的来说根据三大范式来创建表,根据三大关系来关联表(确认关系是建表的前提)

二、三大范式(1NF,2NF,3NF)

1.第一范式:确保每列具有原子性(不可再分)

怎么理解呢?

列具有原子性,说明列不可以再分了,如学校是可分的(分为,学校名,地址,学校号码)他就不符合第一范式,且列中不可以有字符串,多个数据。

为什么呢?

CREATE TABLE `user_hobby` ( `id` bigint NOT NULL PRIMARY KEY COMMENT 'ID', `name` varchar(50) COMMENT '姓名', `hobby` varchar(100) COMMENT '爱好(多个值)' ); -- 插入数据 INSERT INTO `user_hobby` VALUES (1, '张三', '篮球,游泳,看书'), (2, '李四', '跑步,画画');

如果不规范建表,

首先如果你在列中使用了字符串,爱好有多个值,在查询的时候我们还需要拆分字符串,这样会导致效率低

其次,在更新数据时想把 “游泳” 改成 “羽毛球”,必须修改整个字段值,容易误改其他内容(比如把 “篮球,游泳” 改成 “篮球,羽毛球”,少打一个逗号就错了)导致更新异常,

统计麻烦,当我想统计有多少篮球时无法直接聚合。

2.第二范式

核心理解:在满足 1NF 的基础上,表中的所有非主键字段必须完全依赖于整个主键(而不是依赖主键的一部分)

可以说当不存在复合主键时默认满足第二范式,当存在复合主键时也不一定就是不满足第二范式,

举例说明:

以下这张表就不符合第二范式,首先它存在一个复合主键(order_id,product_id),如果说其他字段都完全依赖于该复合主键,那么它满足第二范式,但是product_name依赖于product_id,order_time依赖于order_id,所以它不满足第二范式,

那么为什么要满足第二范式呢?

1.数据冗余,数据里面有很多个小米手机,以及相同的下单时间

2.更新异常,如果要调整手机名称,如小米手机,那么就要更改所有的小米手机,效率低,且可以出现更新不成功的风险。

3.、删除异常,如:我要删除某些订单,那么同时会删除商品名,这样会导致一段时间内没有商品。

3.第三范式

官方说明:在满足 2NF 的基础上,表中的非主键字段不能依赖于其他非主键字段(即消除 “传递依赖”)。、

我们以这个表为例:

这个表只有一个主键user_id,符合1NF,2NF,但是其中,province是依赖于city的而city和province是非主键字段,这样 就会导致数据冗余,以及复现上面所谈到的问题。

这里需要分表,实际生产中我们也都是分表,然后建立关联来建这种表的,

如:

4.三种关联方式

一对一,一对多,多对多

三种关联方式都是为了三种范式而服务的,在设立表之初我们就要对表中的字段进行分类,如课程表和学生表,一门课可以被多个人选择,一个人可以选择多门课,所以这是多对多的关联方式,在建立表时按照这种形式进行分表,下面我们来举例说明:

用户表(user)和用户详情表(user_detail):一个用户只有一个用户信息,一对一

如果我们把所有的字段都放在一起去建一个表那么他就不符合1NF更不要提其他两个范式了,所以使用关联来解决这个问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:20:02

### 技术文章大纲:C语言造轮子大赛

背景与意义 C语言造轮子大赛旨在鼓励开发者深入理解底层原理,通过手动实现常见库或工具(如字符串处理、数据结构、内存管理等)提升编程能力。这类比赛通常考察代码效率、可读性、创新性及对标准库的替代价值。 常见轮子实现方向 基础数据结构…

作者头像 李华
网站建设 2026/4/18 0:49:01

Node.js用require.resolve优化模块加载

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 解锁Node.js模块加载效率:require.resolve的深度优化实践 目录 解锁Node.js模块加载效率:require.resolve…

作者头像 李华
网站建设 2026/4/18 10:12:08

pythonpython付费选座自习室小程序

目录付费选座自习室小程序的功能需求技术实现方案核心功能模块用户体验优化数据安全与性能商业化运营项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作付费选座自习室小程序的功能需求 付费选座自习室小程序…

作者头像 李华
网站建设 2026/4/18 10:07:37

论文开题“黑科技”:书匠策AI如何让你的开题报告“一键起飞”?

写论文开题报告时,你是否也经历过这些“崩溃时刻”?对着空白文档发呆两小时,选题方向像无头苍蝇般乱撞;文献综述翻遍全网,关键信息却像散落的拼图难以整合;研究框架反复修改,逻辑链条始终不够清…

作者头像 李华
网站建设 2026/4/18 8:18:27

亚数金融正式迈向纳斯达克:链上金融新范式2026年初启航

当区块链的透明代码遇见华尔街的严谨金融模型,一张融合了十年跨境业务现金流的F-1表格,正在悄然改写传统金融与数字资产世界的边界。01 里程碑:保密递交终获回应,十年征程步入新阶段2025年深秋,一份承载着亚洲数字金融…

作者头像 李华