网站首页 > 技术文章 正文
数据库是我们经常使用的数据存储工具,所以怎么设计数据表是我们实现代码前需要做的一件很重要的事情,但不是每个企业都有DBA,所以很多时候我们都有可能扮演DBA的角色,那么当你不幸被选中的时候,下面的建议可能对你有些帮助。
关系数据表的设计最重要的有两个部分:表属性、表之间的关系,有了表属性才能够清楚每个表的字段,有了表之间的关系才能够正确的保存一些业务逻辑数据。
表属性
我们以大家看的这篇文章举例说明,发现文章里面有标题、作者、作者LOGO、发布时间、文章内容、评论数等等,那么我们不作加工处理,直接将这些作为文章这个表的属性,这样就得到了一个粗糙的属性列表,下面经过进一步思考,比如作者LOGO这个属性,如果我们将作者的logo保存在文章这个表里面,是不是会出现这样一种情况,就是如果这个作者发了10篇文章,那么就要保存10个一模一样的LOGO在文章数据表里面,这样如果有一天,LOGO修改了,是不是要修改10条数据呢?如果有1000篇文章,这样要修改1000条数据呢?所以这个属性是不合理的,因为改变的话会导致要修改很多很多的数据,所以我们就将这个属性放在存储作者这个数据表里面去,这样修改的话,仅仅修改作者这个表里面的一条数据就可以了,其他属性经过同样的思考不断排除,从而得到一个基本的属性列表。
表之间的关系
一对一
一对一的关系还是比较少的,比如对于文章表,我们刚刚开始的时候没有设计一些统计信息,比如点击数、分享数、浏览数、浏览频率等等,那么这个时候,我们可以新建一张表,用来保存这些数据,并且这个表和文章表里面是一一对应的,就是一篇文章只对应一个统计的记录,一个统计记录只对应一篇文章,这个时候的关系,可以选择任何一个表增加一个附加的属性保存另一个表的主键。
一对多
上面我们提到文章和作者这两个表,你写的文章只能是你的,你一个人可以写很多篇文章,所以作者和文章这两个表的关系是一对多的关系,对于一对多的关系,在多端会增加一个字段用于保存一端的主键字段值,所以这时多端会增加一个附加的属性,有了这个属性,才能够进行关联查询。
多对多
比如商品和分类之间的关系,如果一个商品可能在多个分类下面,一个分类下面又有多个商品,所以应该是多对多的关系,这个时候必须新增一个数据表,用于保存商品和分类之间的关系,这个数据表有两个字段,一个用于保存商品的主键值,一个用于保存分类的主键值,其他字段根据需要分析获得。
由基本属性列表+附加属性列表得到每个表最后的属性列表,有了这些属性列表,我们的单个表字段也就确定了,不管是表属性还是表之间的关系都需要根据具体的业务来决定,而不是死的,这点需要大家切记切记,还有不管怎么说,还是希望大家有时间看看ER、数据库原理相关的知识,只有明白了这些,才能够深刻的理解和数据库相关的很多知识,感谢大家花时间阅读我们的文章。
- 上一篇: 高并发下实现幂等的几种方式(高并发如何解决方案)
- 下一篇: 嵌入式开发越老越吃香?35岁成黄金年龄!
猜你喜欢
- 2025-07-02 mysql count(1)、count(*) 与 count (列名) 的执行区别
- 2025-07-02 高并发下实现幂等的几种方式(高并发如何解决方案)
- 2025-07-02 [JPA教程]02.认识JPA的注解.md(jpa的@query注解)
- 2025-07-02 为啥不推荐使用外键?(什么情况下用外键)
- 2025-07-02 MYSQL存储引擎InnoDB(二):使用注意点
- 2025-07-02 MySQL数据库最常用操作(mysql常见操作)
- 2025-07-02 表格存储 SQL 查询多元索引(表格存储 sql 查询多元索引信息)
- 2025-07-02 雪花算法(雪花算法使用)
- 2025-07-02 MySQL的普通索引和唯一索引到底什么区别?
- 2025-07-02 查询中,有没有可能多个索引一起用呢?
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 510℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 486℃MySQL service启动脚本浅析(r12笔记第59天)
- 466℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 464℃启用MySQL查询缓存(mysql8.0查询缓存)
- 444℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 423℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 419℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)