一、前言

1.1 关系型数据库

数据库关系型模型的概念最早由“关系数据库之父”之称的埃德加·弗兰克·科德(Edgar Frank Codd或E. F. Codd)博士提出,1970年,身为IBM的研究员的他在刊物《Communication of the ACM》上发表了题为大型共享数据库的关系模型的论文,首次提出了数据库的关系模型的概念,奠定了关系模型的理论基础。

本文以MySQL为例介绍数据库表结构的设计。

1.2 数据库的优化模型

一般来说,日常工作中硬件和系统配置不是我们关注的重点,这些钱都就可以解决,我们关注最多的是数据库表结构的设计SQL级索引的优化。在大数据时代,这些理论同样适用,在Hive和HBase中分别有表结构设计和RowKey设计,无论使用其他第三方SQL语言,比如,HQL、Phoenix、SparkSQL或Presto等,SQL及索引的优化是永恒的话题,这里我们主要讨论数据库表结构的设计

1.3 关系型数据库设计的思路

一般地,设计思路包括如下两个主要思路:

  • 二维表
  • 四个范式
  • 业务相关的问题

其中,二维表很容易理解,二维即指,不做细述,以下将详细讨论四个范式和工作中的业务问题。

二、四个范式

2.1 第一范式:不可再分

当表中字段存在可再分情况时,对其进行拆分。

举例

2.2 第二范式:属性完全依赖于某个候选键

简单地说,第二范式满足如下两点要求:

  • 每个表必须有唯一键;
  • 主键是唯一标识。

2.3 第三范式:属性不依赖于其它非主属性

非主属性是指不在任何码(主码和候选码)中出现的属性。

当属性依赖于其他非主属性时,应进行拆分。

举例

未拆分前,属性Level依赖于非主属性Score,无法适应多变的业务,这种设计较为死板,拆分后可灵活更改各个科目对应的level属性,较为灵活,适用于多变的业务。

2.4 第四范式:禁止非主键列和其他非主键列一对多关系

在同一张表中,非主键的列与非主键列存在一对多的关系会造成存储大量的冗余字段,当出现这种状况时,应进行合理拆表。

举例

考试分数等级表中,Grade和Subject存在一对多的关系,浪费了存储空间,且会降低查询效率,拆分后业务的可扩展性更大,也节省了不必要的冗余信息存储所浪费的空间。

三、业务相关问题(撕逼)

3.1 产品经理那些不能相信的话

  • 这个属性值只有一个,这个只有一种情况…
  • 这就是个小项目,不用搞那么麻烦,赶紧做好上线,后面再说…

建表后随着项目的迭代,后期重新设计表结构成本较高,开发需要修改代码逻辑,数据库中已存在的数据要做迁移和二次导入。良好的表结构设计可以帮我们避免很多问题,也会使整个项目更健壮。

3.2 有些还是能信的

  • 这个项目每月访问量预计百万,甚至千万
  • 日活上亿

如果听到这种话,应该庆幸,这个是锻炼的机会,珍惜这样的机会,做好表结构的设计及其他优化工作,这些以后都是财富。

四、 总结

综上所述,表结构的设计是数据库优化中至关重要的环节,需要认真谨慎对待,在遵守四大范式的前提下,充分考虑业务未来的可扩展性,适应未来业务变化,促进系统更加健康健壮。

  1. 本文借鉴了公司内DBA的分享,感谢DBA的指导;
  2. 能力有限,欢迎指错交流。

欢迎关注个人微信公众号WaltSmithML或新浪微博WaltSmith,公众号提供机器学习、深度学习、Hadoop、Spark、Python、数学知识等免费视频教程。本人目前工作主要负责智能推荐和NLP。非常欢迎一起交流学习哈,除了学习,还可免费帮忙download论文或者书籍

♥♥♥欢迎关注微信公众号: 数学与机器学习♥♥♥
♥♥Python机器学习QQ群♥♥

参考文献

  1. 候选码 主码 主属性 非主属性 外码

MySQL数据库表结构的设计相关推荐

  1. ezdml 支付mysql 吗_关于EZDML数据库表结构制作设计工具使用踩的坑

    我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...

  2. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  3. Mysql数据库表结构导出工具介绍

    软件开发过程中,数据库设计是其中非常重要的一个环节,一般在设计阶段都会采用PowerDesigner进行数据库表的设计并生成数据库表结构文档.但是有的时候数据库表结构文档缺失了怎么办,能不能从数据库直 ...

  4. mysql数据库结构导出word_Windows导出MySQL数据库表结构到Word文档-DBExportDoc V1.0 For MySQL...

    必要条件: 1.Microsoft Office Word(我用WPS不行) 2.mysql-connector-odbc 3.会看文档 下载地址:关注微信公众号:八四七,回复5获取,压缩包中包含有具 ...

  5. 使用Navicat 导出 MySQL 数据库表结构、表数据到Excel表格中

    文章目录 1 摘要 2 数据导出 2.1 导出数据库表结构至Excel 2.2 导出数据库表结构为 SQL 2.3 导出数据库表数据至Excel 3 推荐参考资料 1 摘要 在编写项目设计文档的时候, ...

  6. powerdesigner导出mysql数据库表结构到Word

    powerdesigner导出mysql数据库表结构到Word 需求场景 将SQL导入PowerDesigner中生成模型 创建导出的word模版 需求场景 将数据库表导结构出为word文档: 将SQ ...

  7. ezdml 支付mysql 吗_EZDML数据库表结构设计器_设计sql、oracle、mysql数据库表结构 V2.39 免费版...

    很多程序员或者网站站长在设计网站数据库的时候都要进行表结构设计,如果您不想操作原始的数据库工具之想简单设计一下数据库表结构,那么你不妨试试这款EZDML数据库表结构设计器,可以快速设计sql.orac ...

  8. 一个漂亮的输出MySql数据库表结构的PHP页面

    经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...

  9. powerdesigner导出mysql数据库表结构到Excel

    前提 要做数据源的整理,需要将Mysql数据库表的结构导出到Excel表里面做文档记录; 第一个Sheet是所有表格的列表,其他的Sheet是每一个表格的详细字段以及注释说明. 打开PowerDesi ...

最新文章

  1. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...
  2. 用linux遇到的一个死循环
  3. STL 容器中的元素必须满足的条件
  4. 解密双十一小程序云背后毫秒级伸缩的Serverless计算平台:函数计算
  5. react中的state详解
  6. JavaScript 获取当前时间戳的三种方式
  7. 在 Linux 上安装 Go
  8. 错误因为数据库正在使用,所以无法获得对数据库的独占访问权的解决方案(转)...
  9. 好用的桌面搜索引擎(如果你的快捷方式很多,可能会需要它)
  10. 光储直流微电网simulink仿真模型
  11. 概率论总结——泊松分布与指数分布
  12. linux7 (RHEL7.5)超详细系统安装步骤
  13. [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
  14. Vue3的vue-router超详细使用
  15. USACO 2018 FEBURARY CONTEST :SILVER T1
  16. 光模块价格由带宽还是距离决定_佛山单模光模块价格
  17. LeetCode.黑白方格画
  18. Macbook Pro 201 装Win10 声卡_MacBook+BMPCC+康佳PS300共同打造事半功倍视频制作流
  19. 英语长语法难句——状语和状语从句
  20. CoreDNS篇8-健康检查

热门文章

  1. Linux 性能监控工具命令大全
  2. RHEL 5.5 KVM 网卡 bridge设置
  3. Windows 安装appium环境
  4. 全栈工程师必备技能栈,聊聊月薪2W以内都该会点啥?
  5. 华为云服务权限在哪_华为云资源IAM精细控制权限实践
  6. 如何实现根据照片获取地理位置及如何防御照片泄漏地理位置
  7. ES地理范围查询第一讲:Java操作地理位置信息(geo_point)
  8. 02-设计模式 UML类图
  9. New Bing已经出来了,怎么防止Bing跳转到国内版(cn.bing.com)?
  10. ubuntu系统安装时 MBR和GPT的区别