我设计数据库常用的几个原则

以MySQL5.7为例 , 在一个项目中的数据库schema中建表 。
我设计数据库常用的几个原则文章插图
〇、建库统一字符集和排序规则
规则库的默认字符集选择utf8mb4 , 表、字段默认上级
库的排序规则选择utf8mb4_general_ci , 表、字段默认上级
好处统一排序规则 , 防止不必要的隐式转换 , 库级先指定 , 表级 , 字段级默认上级即可 。
一、命名法如果是大小写敏感的数据库【MySQL】就用蛇形命名法【小写+下划线】
如果是大小写不敏感的数据库【SQL Server】就用大驼峰式【大小写】
二、望文生义 , 自说明百度百科中 , 望文生义:汉语成语 , 意思是指不了解某一词句的确切涵义或来源缘由 , 光从字面上去牵强附会 , 做出不确切的解释 。
规则在数据库设计中 , 表名字段名一定要用有意义的名词 , 即自说明 , 每一个名词都是由有意义的英文或者通用英文缩写组成 。 鉴别方式:使用百度搜索字段名中的单词 , 可以搜索到 , 则命名没问题 。
例子公司可以使用 corporation 或者缩写corp , 不能用gongsi , 下图为搜索缩写的结果
我设计数据库常用的几个原则文章插图
数量可以使用 quantity 或者缩写qty , 不能用shuliang、numb(糟糕的选择 , 单词意义是麻木的; 失去知觉的; 迟钝的; 呆滞的)、num 。 下图为缩写搜索的结果
我设计数据库常用的几个原则文章插图
注意:缩写必须是约定俗成的 , 是行业通用的 , 否则宁可字段过长也不要缩写 。 不规范的缩写会导致表名易用性和可维护性变差 。 对开发人员和维护人员极其不友好 。
好处使不了解表结构的人 , 直接看表名、字段名就可以知道表、字段的意义 。 尽量不查备注 , 因为查看备注也需要花时间 , 对开发的编码流畅性干扰很大 。
注意:1、字段名要简短、易于理解、无歧义 。 2、虽然已经望文生义、自说明 , 但是不意味着可以省略备注 , 每个表和字段还是有必要加上备注的 , 防止出现歧义 。
三、字段统一规则意义相同的字段就算在不同表中也要保持字段名相同、保持类型相同 。 所以备注要言简意赅 , 如果不同表出现相同字段 , 只要全库搜索备注就能找到相同意义的字段 , 这样就可以维持字段统一
好处1、依旧是望文生义 , 当已经习惯于一个字段名 , 该字段在其他表中出现对开发识别字段意义有帮助
2、当两个表的数据相互传递时 , 可以使用相同属性名反射实现set、get方法 , 给开发提供便利
3、类型相同防止字段比较时出现隐式类型转换
四、模块分组如果系统设计中划分了模块 , 各模块的表名中必须加了相同的模块简称前缀
例子字典表模块中的
我设计数据库常用的几个原则文章插图
计量单位表dict_unit
公司表dict_corp
系统模块中的
我设计数据库常用的几个原则文章插图
用户表sys_user
角色表sys_role
好处相同模块的表在工具中查看时是排列在一起的 。 方便查找相关表 。
五、主键名主键id不能统一命名为id , 有要加上表信息 , 即用户表user主键user_id
规则不要使用统一id当主键名 , 要有修饰词
例子用户属于某公司 , 即用户表中需要存储公司表的主键作为外键【即使不建立外键】
用户表使用user , 公司表使用corp
如果在公司表中主键id使用id , 但在user表中主键id也是id , 必然user表的外键公司id 应该是corp_id , 这样会导致一个结果当user表和corp表联结时 ,
联结条件必须是user.corp_id = corp.id
如果联结的表过多时表名使用别名a,b,u,c时极其容易写错 , 还不容易排查错误
而如果user表主键定义为user_id , corp表主键定义为corp_id , user表中的公司id外键也定义为corp_id ,
这样当表联结时 , 联结条件写为user.corp_id=corp.corp_id , 联结条件一目了然 。 提高了SQL的可读性 , 节省了阅读SQL时表联结键的确认时间 。
好处【我设计数据库常用的几个原则】节省开发时间 , 就算一次节省半秒 , 上千次之后也会节省十分钟 , 作为一个项目经理或dba , 就算你做不到给开发减轻工作量 , 也不能拖后腿吧 。
符合字段统一原则 。
六、尽量not null规则在设计字段时尽量使用not null不可空 。
数字类型默认0 , 字符串类型默认''零长度的字符串 。