前言:数据库设计在平时的工做是必不可少的,良好的表设计可让咱们查询效率更高,加快网站访问速度,提高用户体验,而且方便于咱们查询数据。本篇博客就来聚焦一下,如何设计出高可复用,优良的表结构,从而在实际的工做中使咱们写出更好的代码。mysql
数据库表设计的几条黄金准则:sql
一:字段的原子性数据库
解释:保证每列的原子性,不可分解,意思表达要清楚,不能含糊,高度归纳字段的含义,能用一个字段表达清楚的毫不使用第二个字段,必需要使用两个字段表达清楚的毫不能使用一个字段缓存
二:主键设计数据库设计
解释:主键不要与业务逻辑有所关联,最好是毫无心义的一串独立不重复的数字,常见的好比UUID或者将主键设置为Auto_increment;网站
三:字段使用次数设计
解释:对于频繁修改的字段(通常是指状态类字段)最好用独立的数字或者单个字母去表示,不用使用汉字或长字符的英文code
四:字段长度视频
解释:建表的时候,字段长度尽可能要比实际业务的字段大3-5个字段左右(考虑到合理性和伸缩性),最好是2的n次方幂值。不能建比实际业务太大的字段长度(好比订单id若是考虑要业务增加的话,必定要使用Long型,对应的数据库的数据类型是bigint),这是由于若是字段长度过大,在进行查询的时候索引在B-Tree树上遍历会越耗费时间,从而查询的时间会越久;可是绝对不能建小,不然mysql数据会报错,程序会抛出异常;索引
五:关于外键
解释:尽可能不要创建外键,保证每一个表的独立性。若是非得保持必定的关系,最好是经过id进行关联
六:动静分离
解释:最好作好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,好比城市/地区名/国家(静态表必定要使用缓存)。动态表:一些频繁修改的表
七:关于code值
解释:使用数字码或者字母去代替实际的名字,也就是尽可能把name转换为code,由于name可能会变(万一变化就会查询处多条数据,从而抛出错误),可是code通常是不会变化的.另外一方面,code值存储的字符较少,也能减小数据库的存储空间的压力
八:关于Null值
解释:尽可能不要有null值,有null值的话,数据库在进行索引的时候查询的时间更久,从而浪费更多的时间!能够在建表的时候设置一个默认值!
九:关于引擎的选择
解释:关于引擎的选择,innodb与myisam,myisam的实际查询速度要比innodb快,由于它不扫面全表,可是myisam不支持事务,没办法保证数据的Acid。选择哪一个这就要看本身对于效率和数据稳定性方面的实际业务的取舍了
十:资源存储
解释:数据库不要存储任何资源文件,好比照片/视频/网站等,能够用文件路径/外链用来代替,这样能够在程序中经过路径,连接等来进行索引
十一:与主键相关
解释:根据数据库设计三大范式,尽可能保证列数据和主键直接相关而不是间接相关
十二:关系映射
解释:多对一或者一对多的关系,关联一张表最好经过id去创建关系,而不是去作重复数据,这样作最大的好处就是中间的关系表比较清楚明白。
十三:预留字段
解释:在设计一张表的时候应该预制一个空白字段,用于之后的扩展,由于你也不是肯定这张表之后不会扩展。
十四:留下单一字段肯定是否可用
解释:经过一个单一字段去控制表是否可用,好比一般起名为isVaild,预制的含义为0为有效,1为无效,这样便于之后咱们去剔除数据或者重整数据,使其成为boolean性质的数据 更加便于咱们去操控。
十五:删除字段
解释:数据库是禁止使用delete命令的,通常都不会真正删除数据,都是采用改状态的方式,设置state字段,经过修改状态赋予它是否有效的逻辑含义!
总结:本篇博文主要介绍了关于数据库设计的几条准则,如何设计出高可复用的数据库和条例清晰的数据库表是咱们一直要关注的话题,在实际的开发中,谨遵以上的准则,起码保证本身的表设计出来的标准性,将会大大提高咱们的工做效率。