数据库设计规范

ops/2024/9/24 17:13:21/

1 命名规范

1.1数据库命名基本原则
  • 所有命名采用26个英文大小写字母和0-9这十个自然数,加上下划线_组成。不能出现其他字符(注释除外)。
  • 长度不超过30个字符。
  • 实际名字尽量描述实体的内容,由英文单词、单词组合或单词缩写组成,不以数字和_开头。
  • 命名中禁止使用SQL关键字。
  • 对象名尽量短。
1.2 表命名规范

约定:表名由前缀和实际名字组成。好的名称能够容易分便表的作用

  • 实体表(切切实实存数据的):t_xxx_xxx
  • 关系表(存表与表之间的关系的):ref_xxx_xxx
  • 字典表:dic_xxx_xxx

注意事项:

  1. 各种类型的表的开头是一致的
  2. 表名要见名知意,不同单词间用"_"连接

表名应该符合以下规范:

  • 统一采用单数形式,反对xxxs
  • 首字母大写,多个单词的话,单词首字母大写,类似驼峰命名
  • 避免中文拼音
  • 避免下划线连接,反对User_Accout(下划线适用Oracle数据库)
  • 避免名称过长
  • 表以单数形式名词或名词短语命名。如果表名仅有一个单词,那么建议不使用缩写,而是用完整的单词。
1.3 字段命名规范

字段由表的简称,实际名字组组成。如果此字段关联另外的字段,那么加下划线_连接关联表字段的字段名。

必有字段
每个表都必须有下面的这些字段:

  • id (bigint unsigned)
  • creator(varchar(32) )创建人
  • updater(varchar(32))更新人
  • create_time(datetime)创建时间
  • modifed_time(datetime)修改时间
  • del_flag(int unsigned)删除标志
  • version:数据记录的版本号,用于乐观锁,非必须

字段应该符合以下规范:

  • 首个字母小写,多个单词的话,单词首字母大写
  • 必须有一主键,主键不直接用ID,而是表名+ID,如userID/orderID
  • 常用的字段name,不直接用name,而是表名+Name,如userName/orderName
  • 常用的字段desc,不直接用desc,而是表名+Desc,如userDesc/orderDesc
  • 大写字母前必须包含至少两个小写的字母
  • 避免中文拼音
  • 避免下划线连接
  • 避免名称过长
  • 避免保留字 

时间的类型选择

      对于MySQL来说,主要有date、datetime、time、timestamp 和 year。

  • date :表示的日期值, 格式yyyy-mm-dd,范围1000-01-01 到 9999-12-31,3字节
  • time :表示的时间值,格式 hh:mm:ss,范围-838:59:59 到 838:59:59,3字节
  • datetime:表示的日期时间值,格式yyyy-mm-dd hh:mm:ss,范围1000-01-01 00:00:00到9999-12-31 23:59:59```,8字节,跟时区无关
  • timestamp:表示的时间戳值,格式为yyyymmddhhmmss,范围1970-01-01 00:00:01到2038-01-19 03:14:07,4字节,跟时区有关
  • year:年份值,格式为yyyy。范围1901到2155,1字节
  • 推荐优先使用datetime类型来保存日期和时间,因为存储范围更大,且跟时区无关

其他注意事项

  • varchar的长度一般设置为32就够了,不用设置为255,除非特别长的情况,不然不设置为255
  • 尽可能选择存储空间小的字段类型,就好像数字类型的,从tinyint,smallint,int,bigint从左往右开始选择
  • 小数类型如金额,则选择decimal,禁止使用float 和double
  • varchar是可变长字符串一般设置为32就够了,不用设置为255,除非特别长的情况,长度不要超过5000。
  • 如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应
  • 同一表中,所有varchar字段的长度加起来,不能大于65535,如果有这样的需求,请使用text/longtext类型
  • 所有的字段都必须为非空字段,也就是说你要设置默认值

对象:

  • 主键索引以PK_为前缀
  • 唯一索引以UK_为前缀
  • 索引以IDX_为前缀
  • 前缀后的首字母大写,多个单词的话,单词首字母大写,如PK_xxxID
  • 所有的关键字的所有字母必须大写,如SELECT userID,username FROM User
  • 采用有意义的字段名,应该是易于理解,能表达字段功能的英文单词或单词缩写,一般不超过三个英文单词。
  • 系统中所有属于内码的字段(仅用于表示唯一性和程序内部用到的标识性字段),名称取为:ID。
  • 系统中属于是业务范围内的编号的字段,其代表一定的业务信息,字段建议命名为CODE,其数据类型为VARCHAR,该字段需加唯一索引。
  • 字段名不要与表名重复
1.4 SQL语句命名规范

2 设计范式

约定:所有SQL关键词全部大写。

不需要严格遵守3nf,通过业务字段冗余来减少表关联

  • 第一范式:对属性原子性,要求属性具有原子性,不可再分解
  • 第二范式:对记录的唯一性,要求除了主键以外的其他列,都依赖与该主键
  • 第三范式:确保每列都和主键列直接相关,而不是间接相关)是要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

      我们设计表及其字段之间的关系,应尽量满足第三范式,但是有时候,可以适当冗余,来提高效率,比如如下张表

商品名称商品型号单价数量总价
华为手机p603000515000

以上这张表存放商品信息的基本表,总价这个字段的存在,表明该表的设计不满足第三范式,因为总金额可以由单价*数量得到,说明总金额是冗余字段,但是,增加总金额这个冗余字段,可以提高查询统计速度,这就是以空间换时间的方法

3 1:N关系的设计、

       日常开发中,1对多的关系应该是非常常见的。比如一个班级有多个学生,一个部门有多个员工等等。这种的建表原则就是:在从表(N的这一方)创建一个字段,以字段作为外键指向主表(1的这一方)的主键。

      学生表是多(N)的一方,会有个字段保存班级表的主键。当然,一般不加外键约束哈,只是单纯保存这个关系而已。(不搞外键关联,一般都在代码维护)

       有时候两张表存在N:N关系时,我们应该消除这种关系。通过增加第三张表,把N:N修改为两个 1:N。比如图书和读者,是一个典型的多对多的关系。一本书可以被多个读者借,一个读者又可以借多本书。我们就可以设计一个借书表,包含图书表的主键,以及读者的主键,以及借还标记等字段。


http://www.ppmy.cn/ops/37256.html

相关文章

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

10000字讲解IoC 思想以及五大注解

文章目录 IoC 思想通过案例讲解 IoC1.传统的开发方式 SpringIoC 和 DI五大注解ControllerServiceComponentRepositoryConfiguration 为什么要有这么多的类注解类注解之间的关系方法注解 Bean重命名 bean扫描路径 IoC 思想 什么是 Spring 呢? 我们经常听到的都是说…

力扣hot100:101. 对称二叉树(双指针以不同方式递归)

LeetCode:101. 对称二叉树 看了第一个样例,很容易直接层序遍历看每一层的前后是否相同。但接下来这个样例告诉你,不能这样做。 层序遍历 仔细思考会发现,层序遍历不能看本结点,但是可以看儿子结点是否对称&#xf…

数论:不定方程的引入

研究的对象:不定方程 文章目录 研究的对象:不定方程不定方程引入:裴蜀定理证明:欧几里得算法证明:充分性证明:必要性证明: 战术总结: 不定方程引入: 不定方程&#xff0…

使用Express+Node.js搭建网站

Express是一个基于Node.js平台的快速、开放、极简的Web开发框架。它的作用是专门用来创建Web服务器,与Node.js内置的http模块功能相似,但更为简便和高效。 Express中文官网:Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文…

mysql相关知识点

1、将时间格式化为字符串 SELECT DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s) 2、获取当前时间(年、月、日、时、分、秒) SELECT NOW() 或者 SELECT CURRENT_TIMESTAMP() ; 3、获取当前时间,精确到毫秒 SELECT NOW(3) 或者 SELECT CURRENT_…

币圈Cryptosquare论坛

Cryptosquare综合性资讯论坛汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性,探索Cryptosquare论坛带来的精彩! 币圈新闻板块: Cryptosquare论坛的币圈新闻板块是用户获取最新加密货币行业…

Java 反射

1 反射概述 1.1 什么是反射 反射机制(Reflection)是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字,就可以通过反射机制来获取类的所有属性和方法。 反射的作用: 可以动态查看一个类或对象的所有属性和…