设计数据库时,一个数据可能有多种状态,如果能用一个字段表示,是否有必要为了便于理解或者其他原因,拆分成两个字段?
举个例子,一个付款审批记录的状态可能有:待审批->已审批(待付款)->已付款,有三种可能的值(先不考虑审批拒绝)。或者可以拆分成两个状态字段:审批状态和付款状态,但是这样设计也只有三种可能的组合:待审批待付款、已审批待付款、已审批已付款。
究竟哪一种设计是更合理的?
设计数据库时,一个数据可能有多种状态,如果能用一个字段表示,是否有必要为了便于理解或者其他原因,拆分成两个字段?
举个例子,一个付款审批记录的状态可能有:待审批->已审批(待付款)->已付款,有三种可能的值(先不考虑审批拒绝)。或者可以拆分成两个状态字段:审批状态和付款状态,但是这样设计也只有三种可能的组合:待审批待付款、已审批待付款、已审批已付款。
究竟哪一种设计是更合理的?
没必要的,除非状态是并发的。就是必然审批后才会付款还是审批和付款无关,前者一个字段,后者两个字段。因为拆分之后对于状态机就不友好了,还要进行排序合并。
具体来说,如果状态是资料提交->待审批->审批中->已审批待付款->付款中->已付款,必然会出现审批失败或付款失败导致状态回溯的,你分成好几个字段咋儿玩。
至于统计优化,那是优化的问题,还是如上的流程,你可以再来一个待处理->处理中->已完成的状态,其中处理中 = 审批中->已审批待付款->付款中,这样不就优化出来了吗。
不要寄希望于一个设计解决很多事情,这样只会造成边界混乱。
一般这种我建议分字段进行状态记录。审批状态(0-未审批 1-已审批) 付款状态(0-未付款 1-已付款)
原因:1.这种场景的组合一般比较多,如果使用一个字段会导致码值较多、理解困难 2.对于后台处理或者前台展示如果需要分开使用的还需二次加工处理,比较繁琐,且容易出错
15 回答8.4k 阅读
4 回答4.4k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
个人观点: 没有什么合不合理,只有适不适用。
如果有需要的话,我甚至会设置三个字段:审批状态、付款状态、记录总状态
为什么要设置三个字段:便于查询,是的,只是为了方便查询。
举个例子:
一个数据量很大的订单表,一个订单商品表。一条订单记录有多个商品。用户想查询这个订单买了多少个商品,怎么写sql查询?
1.left join 之后进行统计, 运行时间1.2s
2.select * from order_goods where order_id in xxx; in之后进行统计。 运行时间1.2s
3.order表加个字段。查询时直接读该字段。 运行时间0.2s
再说回题主的问题。
一个是范围查询,一个是等值查询,查询的效率可想而知。