一、数据库表设计规范「建议收藏」

一、数据库表设计规范「建议收藏」一、三范式为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。1.第一范式确保每列保持原子性列不可分 有主键根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常…

大家好,又见面了,我是你们的朋友全栈君。

一、三范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

1.第一范式

确保每列保持原子性

  • 列不可分
  • 有主键

根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。

一、数据库表设计规范「建议收藏」

 

2.第二范式

确保表中的每列都和主键相关

  • 每个表只描述一件事
  • 主要针对联合主键而言,不存在部分依赖,每一列都跟联合主键有关系,而与联合主键中的其中一个键无关系

比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。

一、数据库表设计规范「建议收藏」

这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的联合主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

一、数据库表设计规范「建议收藏」

 

 

一、数据库表设计规范「建议收藏」

一、数据库表设计规范「建议收藏」

这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

 

3.第三范式

确保每列都和主键列直接相关,而不是间接相关,不存在传递依赖。第三范式需要确保数据表中的,每一列数据都和主键直接相关,而不能间接相关解决间接相关,把不直接相关的再建一张表,采用外键形式将两张表关联.

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段,因为添加后就会出现传递依赖 :

订单编号–》客户编号, 客户编号–》客户详细信息

 

如下面这两个表所示的设计就是一个满足第三范式的数据库表。

一、数据库表设计规范「建议收藏」

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。

 

 

二、数据库表设计规范

1.表与字段的规范

(1)表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否 ) 。

说明:任何字段如果为非负数,必须是 unsigned 。

正例:表达逻辑删除的字段名 is_deleted ,1 表示删除,0 表示未删除。

 

(2)表名、字段名必须使用小写字母或数字并以下划线分隔 , 禁止出现数字开头,禁止两个下划线中间只出现数字,名字要做到见名思意,不要超过32个字符。

说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。

正例: aliyun _ admin , rdc _ config , level 3_ name

反例: AliyunAdmin , rdcConfig , level _3_ name

 

(3)小数类型为 decimal ,禁止使用 float 和 double 。

说明: float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

 

(4)表必备三字段: id 主键,  gmt _ create创建时间 ,  gmt _ modified更新时间 。

 

(5)不同表之间存储相同数据的列名和列类型必须一致(关联列)

 

(6)优先选择符合存储需要的最小、最简单的数据类型。

选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。越简单的数据类型在计算时需要更少的CPU周期,比如,整型就比字符操作代价低,因而会使用整型来存储ip地址,使用DATETIME来存储时间,而不是使用字符串。

①尽量使用数字型字段

      若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

 

②尽量使用位数较少的类型 ,比如能使用TINYINT/SMALLINT就不使用int,能使用无符号位就不适用有符号数据类型

 

③尽可能的使用 varchar/nvarchar 代替 char/nchar

      因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。只有在存储的字符串长度几乎相等,使用 char 定长字符串类型。

 

(7)不得使用外键与级联,一切外键概念必须在应用层解决。

 

(8)表和字段名要加注释

 

(9)将字段很多的表分解成多个表

将使用频率低的字段拿出来新建一个表,完成分表,从而提高效率

 

(10)增加冗余字段

适当的不遵循范式的要求,对于经查查询的外表字段可以在本表中增加冗余字段。比如经常要查一个学生的系名,就可以在学生表加一个系名的字段

 

2.索引规范

(1)业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。

说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的 。

 

(2)主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。

 

(3)在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。

 

(4)限制每张表的索引数量,建议每张表的索引数量不超过5个,并且针对复合索引,最常用的、区分度最高的(列中不同值数量/列的总行数)、字段长度小的放到最左侧

 

(5)索引列定义为 not null

索引null列需要额外空间保存,需要占用更多地空间,运算和比较的时候会占用更多的空间

 

(6)值分布稀少的字段不适合建立索引,比如性别

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151601.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月19日 下午11:46
下一篇 2022年6月20日 上午6:00


相关推荐

  • strncmp函数的简单用法

    strncmp函数的简单用法来自朱有鹏老师的课堂笔记 strncmp buf end 3 参数 第一 二个参数是需要比较的两个字符串第三个参数是要比较的字符的数目举例 if strncmp buf end 3 0 printf 程序退出 n exit 0 头文件是 include stdlib h 说明 比较 buf 中的字符是否与字符串 stdlib h

    2026年1月15日
    2
  • PCEP 协议学习笔记

    PCEP 协议学习笔记RFC5440章节:PCReq消息响应PCC发送的PCReq的

    2025年9月30日
    9
  • 将 VSCode 快捷键修改为 eclipse的快捷键[通俗易懂]

    将 VSCode 快捷键修改为 eclipse的快捷键[通俗易懂]文章目录1、VSCode中打开`命令面板`,如下图所示。2)在命令面板中输入`keyboard`3)打开`首选项:打开键盘快捷方式(JSON)`4)在`keybindings.json`中配置快捷键配置1(常用的快捷键)配置2(最全的快捷键)1、VSCode中打开命令面板,如下图所示。2)在命令面板中输入keyboard在命令面板中输入keyboard,然后在列表中选择首选项:打开键盘快捷方式(JSON):3)打开首选项:打开键盘快捷方式(JSON)点击

    2022年6月3日
    101
  • Java文件上传详解

    Java文件上传详解Java文件上传详解文件上传和下载准备工作使用类介绍代码编写文件上传和下载在Web应用中,文件上传和下载功能是非常常用的功能,这篇博客就来讲一下JavaWeb中的文件上传和下载功能的实现。准备工作对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的。一般选择采用apache的开源工具common-fileupload这个文件上传组件。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。首先下载最新的jar包https://mvnr

    2022年5月14日
    43
  • PE盘装系统时无法找到ISO文件

    PE盘装系统时无法找到ISO文件用PE盘装系统时,在选择包含Windows安装文件的文件夹时,找不到ISO系统镜像映像,如图所示此时在‘选择包含Windows安装文件的文件夹’选项时,不能鼠标左击,需要右击。。。…

    2022年6月25日
    86
  • 如何写cover letter 翻译自How to write a cover letter

    如何写cover letter 翻译自How to write a cover letter本文是此文章的中文翻译,有根据自己不一定正确的理解进行的改动。如何写coverletter一个好的coverletter是所提交的内容的一个重要组成部分。它并不是一个电子时代过时的古老交流方式,而应该被看作一个向编辑传达论文中的重要信息的机会。所有提交的论文(指本期刊)都要经过editorialevaluation阶段,但尽管我们都是专业的编辑,我们也不可能了解期刊内容所涵盖的每一个领域。因此,提交coverletter不仅能够帮助编辑快速地决定是否秒拒你,也能够帮…

    2022年6月11日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号