每次面临新建数据表或新加字段,都会触发我的选择困难症;
1,究竟是什么类型:integer,char,varchar,tinyint?
2,类型的长度:integer该设置为多长,varchar该多长?
3,是否可以容许为空值?
4,不容许为空的话,默认值该是什么?
5,如何设置索引?
所以我做了下总结了风格和习惯,未必都对。大家做个参考:
究竟什么类型?
integer用于时间戳、商品价格。主要接触的是电商系统,我会把商品价格以”分“为单位进行保存,而不是”元“。避免带来传递过程中的精度不一致问题。
tinyint用于状态值、事件值、是非值(0/1)。因为mysql是没有布尔值的。
文本类型的定义为varchar。
类型长度?
integer、tinyint都定义为长度10位;varchar统一是255位。这样是不是有点浪费?放心好了,一般项目这点浪费很小。
可否为空?默认值是什么?
这两个问题是连一起的。我给团队的规定是,任何情况先不容许为空值。因为如果最后通过后端接口暴露出去后,为空的值会用null来表示,iOS是不认识的;当然也是可以克服的,只是想说,各个系统对于空值的表示并不一致,所以干脆不能为空。
关于默认值,我不会在表里面设置。实际上数据库作为一个数据持久化的场所,它知道的业务逻辑越少越好,默认值本质也算是一个业务逻辑。我的做法是写在业务代码里,在一个bean初始化的时候,就定义好其默认值。对于工程师来说,也形成了严谨的态度,保存记录前认真赋每个值。
关于业务逻辑不要写在数据库里这条准则:另一个类似做法就是,不写存储过程。因为根本无法进行代码管理。
如何设置索引值?
一个项目完成前,其实你是不能完全确定如何合理设置索引的。只有在项目完成后,再回来针对你写的sql语句,设置对应的索引。
总结下
按照以上准则来做,新建表再也难不倒我了。无非就是 integer 10位,不容许为空;然后设置下一个。。。项目结束后,回头再仔细调整下字段就OK了。
其他妙招
1,对于状态值、事件值:
我们总是不明白 1,2,3代表什么含义。即使当时是你自己建的,我保证你到第二天也忘了。好办法就是,增加个解释字段。比方 status,同时建个status_name来保存它具体的含义。
2,永远不要向外暴露id值:
之前做个类似偷菜的营销小工具,因为向外暴露的是用户的id值;让后就被人刷了,稍懂些的人就知道只要略微改造下链接,就可以查看其它人菜园了。。。 关键的id值,一定要用序列号来代替,让人找不规律,无法刷。
3,插入时间
所有会动态插入的数据都要加上add_time字段,方便之后排序和检查。
4,更新时间:
所有会动态更新的数据都要加上updat_time字段,方便之后排序和检查;特别重要的数据,甚至要记录下每次更新事件。
5,weight(权重字段):
对于商品、banner图之类的数据表,一定要加上weight。反正早晚产品经理也会让你加上的。
6,主键:
不是所有表都要加上自增字段的,如果有了可以作为主键的字段;自增字段就不需要了。
7,日志表:
记录系统里数据更新事件、或操作日志。
网友评论