前言
合理的表结构设计,不仅仅让我们后面扩展表方便,还会大大提升数据库性能。
示例
计数类、记录业务操作类等场景,都可以采用以下表结构设计。
计数类
场景描述:
id | task_id | sniff_valid | sniff_invalid | sniff_req | version | create_time | modify_time | delete | |
1 | 1001 |
该表的作用是:每当有嗅探请求或者结果时,实时进行数据更新。比如‘嗅探结果有效’,则sniff_valid加1;‘嗅探结果无效’,则sniff_invalid加1;每次‘嗅探请求’,则sniff_req加1.
分析:
以上表结构有个很大的弊端:数据库的锁粒度太大。当采用Innodb存储引擎的时候,如果此处sniff_valid进行更新,就会把改行数据【锁】住,那么此时sniff_invalid和sniff_req也无法更新。 sniff_valid更新,与sniff_invalid和sniff_req无关,但是sniff_invalid和sniff_req还得等。 太浪费性能和时间了。
改进:
id | task_id | record_type | record_value | version | create_time | modify_time | delete |
1 | 1001 | sniff_num | |||||
2 | 1001 | sniff_valid | |||||
3 | 1001 | sniff_invalid |
业务操作类
场景描述:
id | task_id | audit_start | audit_end | audit_consume | version | create_time | modify_time | delete | |
1 | 1001 |
该表用来存储用户的操作记录,目前用户的操作记录有:审核开始时间、审核结束时间、审核耗时。但是后续可能大概率还会记录:任务生成时间、任务结束时间、任务耗时....操作。
你可能会想到可以预留几个字段,但是预留的字段毕竟属于下策:是实在不得已的时候才会采用。
改进:
id | task_id | record_type | record_value | version | create_time | modify_time | delete |
1 | 1001 | audit_start | |||||
2 | 1001 | audit_end | |||||
3 | 1001 | audit_consume |