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


日期类型如果可以默认当前时间 。
我知道作为开发人员嫌不可空麻烦 , 但是实际上可以在实体的getter方法中改写
数字可以return userId ==null?0:userID;
字符串可以return name ==null?"":name.trim();
日期可以return dt==null?new DateTime();
以上写法可以保证你的实体在插入时肯定不空 , 虽然开发写起来麻烦 , 但是好处多多 。
好处易于优化 , 虽然很多开发不以为然 , 但是你的项目真的需要高性能时你会后悔莫及 , 而很多项目开始时由于开发不考虑性能导致后期优化很费劲 , 为什么不提前把可以做好的做到最好 。
节省空间 , 虽然可能只节省一个bit , 但积少成多 , 好的性能都是一点一点积累出来的 。
防止java出现空指针 , 好多空指针都是由于脏数据引起的 。
NULL可能导致计算错误 。 例如concat(a , b) , 若a是NULL , 结果为NULL 。
如果时间字段无法默认时间 , 完全可以设置为null , 不要在心里就反对null或者反对not null , 我们是设计数据库 , 不要出现党*争 。
七、注意varchar当字段可以确定长度不超过一定数值时 , 建议使用char定长字符串类型 , 但如果整张表已经出现变长字段 , 那么都使用变长字段即可 。
规则如果可以都使用定长字符串 , 如果做不到就都使用变长字符串
好处节省空间
易于优化
速度快 , DBMS易于处理
八、范式尽量符合三范式
规则字段不可分割、表有主键、数据没有允余、表间关系明确
好处范式目的是使结构更合理 , 消除存储异常 , 使数据冗余尽量小 。 便于插入、删除和更新 。
范式是给关系型数据库创立的 。 对于增删改查四种操作总体来说性能和易用性最佳 。 如果你们的表只需要插入和查询 , 或者只需要插入和清空 , CRUD四种操作不全需要时 , 完全可以违反范式 。 具体情况具体分析 , 没有必要在心里就反对范式或者严格遵守范式 。 我们是设计数据库 , 不是教条主义 , 不要出现党*争 。
九、固定字段删除标志、创建时间、修改修改、创建人id、修改人id五个字段为必须字段 。
规则删除标志默认为未删除的值 ,
创建时间设置为当前时间 ,
修改时间设置为数据修改时更新 ,
创建人设置id默认为0
创建人设置id默认为0
好处大部分情况 , 这些字段都有必要 , 除非不需要保留已删除数据的不需要删除标识 , 而这种情况 , 基本在项目开始时分辨不出需要逻辑删除还是物理删除 。
创建时间、修改时间、创建人、修改人没必要解释
十、状态值规则状态值 , 尽量不使用0 , 一般选择10 , 20 , 30 , 40等 ,
好处防止需求突然加中间状态 , 原来定义的是0 , 1 , 2 , 3连续的状态 , 突然需要在2 , 3之间加个新状态 , 只能使用4 , 这样会对开发理解造成障碍 , 而如果初始就使用10 , 20 , 30 , 40作为状态 , 突然需要在20 , 30之间添加新的状态 , 完全可以使用25 , 即好理解又符合逻辑 。
0对于前端开发不友好 。
最后、上线前统一字符集和排序规则项目上线之前执行以下SQL , 会查询出指定库下的所有字段的排序规则和字符集 , 一定要统一后 , 再上线其他老生常谈的问题可以自己查找 , 比如建议使用自增列做主键等
select table_name,column_name,character_set_name,collation_namefrom information_schema.columns where table_schema = '库名' and data_type = 'varchar'
好处防止字符串比较时出现隐式转换 。
总结、好的设计会提高性能 , 提升便利在保证性能的基础上 , 方便开发、易于运维、易于交接 。
以上原则不是铁律 , 如果有的原则导致性能急剧下降 , 使用很不便利 , 完全可以无视原则 , 具体情况具体分析 。 世界上没有放之四海皆准的规则 。
作者: 公敌依波拉 一剑破万法
出处: