目录

  • 1. 第一范式:原子性,不可再分
  • 1.1. 是否为原子性
  • 1.2. 典型的例子:多个信息用分隔符拼接记录
  • 2. 第二范式:非主键必须完全依赖于主键,而不能只依赖于主键的一部分
  • 2.1. 不符合此特性的示例
  • 3. 第三范式:非主键必须直接依赖于主键,而不是传递依赖或间接依赖
  • 3.1. 不符合此特性的示例
  • 4. 后话
  • 5. 参考的优秀文章

数据库设计是件严肃、关键的事儿,一毕业,加入一个大型的行业项目,那儿的前辈资深工程师,就给我灌输数据库如何关键、神圣、深不可测的观念,所以,我一直怀着崇拜的眼神。

几年前,项目经理把一个小项目的数据库设计工作交给我,我除了花费晚上和周末去完成。后来,更由于第一次负责整个系统的数据库设计,更请教了以前公司的架构师哥们,帮我把把关,看自己有哪些木有想到的。

后来,将设计方案通过了评审,甚是高兴,毕竟自己第一次设计一个系统的表结构,尽管,是一个小系统。

那么,有了几次数据库表结构设计经验,如何描述你设计表所遵循的原则呢?这时候,回归到大学课本,就是范式(Normal Form)。

1. 第一范式:原子性,不可再分

原子性,即,字段应该是不可再分的。

1.1. 是否为原子性

如,一个系统的地址用于邮寄商品,那么下表的ADDRESS是符合第一范式的。

ID USER_NAME AGE PHONE ADDRESS
1 Nick Huang 18 12345678 深圳市罗湖区地王大厦1003室

而如何判断是否原子性,这需要根据实际的业务判断。

比如一些系统仅根据地址作送货服务的,则使用上述的结构即满足第一范式;而某些系统,地址除了用于送货,还需要对用户所在地区分布做长期的统计,为了统计方便,上面的ADDRESS设计就不符合原子性了,也许应该为:

ID USER_NAME AGE PHONE PROVINCE CITY ADDRESS
1 Nick Huang 10 12345678 广东省 深圳市 地王大厦1003室

1.2. 典型的例子:多个信息用分隔符拼接记录

还有其他一些典型的不符合原子性的,就是将多个数据放在一个字段中了。

如Phone字段:

ID USER_NAME AGE PHONE
1 Nick Huang 10 23658745,25654150

还有这种情况,如EXT_FIELDS字段:

ID USER_NAME AGE PHONE ADDRESS EXT_FIELDS
1 Nick Huang 10 12345678 深圳市XXX <DATA><JOB>Programmer</JOB><PASSPORT>12345678</PASSPORT></DATA>

2. 第二范式:非主键必须完全依赖于主键,而不能只依赖于主键的一部分

非主键必须完全依赖于主键,而不能只依赖于主键的一部分(联合主键)

2.1. 不符合此特性的示例

博文《权限管理系统概要设计》有一系列用户权限的表,如果以此为例子,将其中的表结构设计为如下,则不符合第二范式:

USER_ID、ROLE_ID为主键,描述用户和角色的关联关系;STATUS描述这个关联关系是生效还是失效。

可以看出,STATUS是描述这段关联的,是依赖USER_ID、ROLE_ID的,即完全依赖于主键。

而USER_NAME是用户名称,它只依赖于USER_ID,即只依赖于主键的一部分。USER_NAME字段的设置不符合第二范式。

如果有一天,用户的名称需要修改,那么就要修改与此用户相关的每一笔关联的数据。

3. 第三范式:非主键必须直接依赖于主键,而不是传递依赖或间接依赖

非主键必须直接依赖于主键,而不是传递依赖或间接依赖。

3.1. 不符合此特性的示例

博文《权限管理系统概要设计》有一系列用户权限的表,如果以此为例子,将其中的表结构设计为如下,则不符合第三范式:

此为角色表,ID为角色ID,NAME为角色名称,STATUS为此角色是否生效,SYSTEM_ID为此角色所属的系统ID,SYSTEM_NAME为此角色所属的系统的名称。

可以看出SYSTEM_NAME为传递依赖,在角色表中SYSTEM_ID依赖与ID,而SYSTEM_NAME有依赖与SYSTEM_ID。SYSTEM_NAME字段的设置不符合第三范式。

4. 后话

是不是数据库设计一定得严格遵守3范式呢?

这不一定,要视具体情况,实际上,常见许多情况故意设置冗余字段使系统查询更高效、更方便。

转载于:https://www.cnblogs.com/CandiceW/p/10033424.html

【Normal Form】数据库表结构设计所遵从的范式相关推荐

  1. PHP网站配置(系统设置)数据库表结构及实现

    网站后台一般少不了站点配置,一种方式是写到配置文件里,第二种是写到数据库,下面以写到数据库为例 数据库表结构 DROP TABLE IF EXISTS `option`; CREATE TABLE ` ...

  2. 简洁好用的数据库表结构文档生成工具!

    在企业级开发中.我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有.要么有.但都是手写.后期运维开发,需要手动进行维护到文档中,很是繁琐.如果忘记一 ...

  3. zabbix数据库表结构简单解析

    zabbix数据库表结构-持续更新 时间 2014-06-11 21:59:08  furion's blog 原文  http://www.furion.info/623.html 主题 MySQL ...

  4. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档(转

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  5. 比较数据库表结构之间的差异

    在工作中常常会遇到升级的事情,对于不同的用户,有时所使用的数据库的表结构也会有一些不同,时间长了,往往就需要一份各版本数据库表结构的差异报告了.当你需要一份这样的报告时,你会怎么做?一个个的比较每个库 ...

  6. Java实现数据库表结构导出到Excel

    2019独角兽企业重金招聘Python工程师标准>>> 本人自己写的一个工具,界面化,稍微配置即可数据库中的表的结构导出到Excel. 源码地址数据库表结构导出到Excel一键式工具 ...

  7. 开源数据库表结构文档生成器

    大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 TJ君前几天和一个在银行科技部上班的同学聚会,同学跟TJ君吐槽,一些小银行的科技表面看上去专业,实际各种马虎不负责. 打个比方,有一次 ...

  8. 关系型数据库表结构的两个设计技巧

    关系型数据库表结构的设计,有下面两个设计技巧: 物理主键作为关联的外键 关系型数据库,由多个数据表构成.每一个数据表的结构是相同的,不同表之间可能存在关联关系.表之间的关联关系,正是关系型数据库得名的 ...

  9. OSSIM主要数据库表结构

    OSSIM主要数据库表结构 对于从事OSSIM开发的技术人员,最主要的需要知道OSSIM库里的多种表结构,下面举几个典型事例: /* ======== config表 ======== */ DROP ...

最新文章

  1. VOLTE parameter in Attach Request/Accept message
  2. Vue之vue-cli安装与简单调试
  3. Java多线程详解[狂神说Java]
  4. 【CyberSecurityLearning 19】NAT与动态路由协议RIP
  5. Java 面向对象的设计原则
  6. excel高级筛选怎么用_excel中使用高级筛选7个示例、多个条件、复制到另一个工作表公式...
  7. Oracle DataBase单实例使用ASM案例(2)--Oracle 11g之环境准备
  8. numpy tricks(二)—— 删除多维数组的行或列
  9. 现浇板用弹性计算方法_弹性楼板的计算和选择
  10. MySQL 简单查询语句练习题(4+18)
  11. 微软苏州二期全面封顶,明年投入使用!三期开工时间已定,研发人才将达5000余人!...
  12. yxy小蒟蒻的201113总结
  13. 爬虫剑谱第七页(输入关键词爬取拼多多商品信息并进行保存)
  14. 福建农村信用社计算机类C卷考什么,2015年福建省农村信用社公开招聘考试《计算机类》真题及详解...
  15. 凯利讯讲解为什么MOS管可以防止电源反接?
  16. Git GUI Here 设置成中文界面
  17. 初识selenium--发送QQ邮件
  18. FTP文件传输协议详解
  19. IDEA SpringBoot 同一个模块启动多个服务(实例)
  20. Ubuntu1804 配置静态IP

热门文章

  1. gradient设置上下渐变_css3渐变之线性渐变linear-gradient
  2. python树结构_Python-简单的树结构实现
  3. python如何进阶提升_Python序列操作之进阶篇
  4. nginx 端口没有被占用启动闪退_Nginx 的简单使用 (IIS,Asp.Net) - 奋斗的中年人哈哈哈...
  5. linux 压缩文件夹的一部分
  6. 上顿号符号_标点符号常见错误,读后涨知识了
  7. 华师大数据科学考研_2020年30所微电子院校考研信息详细汇总
  8. python新旧特性过渡_网站改版时的一种新旧版过渡方案
  9. 如何获取58上真实号码_如何获取Apollo上项目下的所有namespace?
  10. python读excel 包含格式_python里读写excel等数据文件的几种常用方式