数据库设计规
数据库设计规
目的
为规范数据管理,统一数据设计,特指定本规范。
本规范的主要目的是希望规范数据库设计,尽量提前避免有于数据设计不当而产生的麻烦。
通用规范
使用英文:要用简单命了的英文单词,不要用拼音,特别是拼音缩写。主要目的明确,让人容易明白这个对象是做什么用的;
一律小写,特别是表名:有些数据库,表的命名乃至其他数据对象的命名是大小写敏感的,为了避免不必要的麻烦,并且尊重通常习惯,最好一律小写;
数据对象命名规范
数据库命名
- 前缀
db
下划线_
项目名称,多个英文单词请用下划线分割;- 例如:
db_log
- 例如:
db_log_analysis
- 例如:
表的命名
- 前缀
t
加下划线_
加表名,多个英文单词请用下划线分割;- 例如:
t_user
- 例如:
t_user_log
- 例如:
字段命名
- 尽量避免使用数据库关键命名 ,多个英文单词请用下划线分割;
- 例如:
name
type
index
等等 - 例如:
create_time
user_name
- 例如:
备注
- 数据需加备注信息
- 表需要备注,说明该表存放的是什么数据
- 字段需要备注,说明该字段含义以及各种状态
CREATE TABLE `t_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(50) DEFAULT NULL COMMENT '菜单名称',
`icon` varchar(50) DEFAULT NULL COMMENT 'icon',
`router` varchar(50) DEFAULT NULL COMMENT '页面路由',
`url` varchar(50) DEFAULT NULL COMMENT '请求路径: /admin/**',
`type` int(1) DEFAULT NULL COMMENT '类型[1一级,2二级,3三级,4按钮]',
`parent_id` int(11) DEFAULT NULL COMMENT '父级菜单ID,一级为0',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统菜单';
数据常用字段说明
create_time
创建时间
- 数据需要设置默认值,避免代码中每次创建对象每次插入当前时间。
update_time
更新时间
- 数据需要设置默认值。
is_enable
表状态字段
- [true是false否] 1为真0为假
- 项目中所有需要用户状态的字段,且只有两种状态请使用该字段
- 字段类型
tinyint
- 长度为 1
- 无符号型
- 字段类型
is_delete
假删除字段
- 是否删除[true是false否] 1为真0为假
- 项目中所有需要假删除数据,请使用该字段
- 字段类型
tinyint
- 长度为1
- 无符号型
- 字段类型
creator_id
创建者
- 表需要关联当前记录创建人,请使用该字段。
表关联关系
所有表不使用物理外键关联,请使用逻辑关联即可
表字段长度
请合理分配字段长度避免资源浪费
错误示范:手机号11位,使用
varchar(255)
请避免
数据设计
非特殊需求特殊情况,请遵守数据库设计三大范式;
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。
1NF
- 每一列属性都是不可再分的属性值,确保每一列的原子性
- 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
2NF
- 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分
3NF
- 属性不依赖于其它非主属性,而直接依赖于主键