MySQL表结构一个字段多个状态设计
场景
关于产品的状态字段:
- 需求V1.0,产品,有是否上架、是否删除的状态。之前的做法是产品表结构中定义两个字段:is_online、is_del,分别用1和0的值来判断是和否。
- 需求V2.0,新增需求,产品要有是否置顶、是否热门的状态。因为之前的表结构设计,这时候,我们就要动表结构。缺点可自行百度,这里不做赘述。
- 需求V3.0,新增是否推荐的状态。。。
面对市需求的变化,我们技术需要考虑,如何增强自身系统的可扩展性,减少成本、提高效率。回到技术本身,利用技术基础知识,优化表结构设计。
利用二进制来表示状态
百度百科:
二进制(binary)在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的。
这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 [1] 。
数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。
每个数字称为一个比特(Bit,Binary digit的缩写) 。
字节
字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。是二进制数据的单位,一个字节通常8位长。1Byte=8 Bit。
字节,对应的二进制:
0000 0000
使用二进制位来代表一个字段的多个状态,每个位置,代表一个状态,多个位置代表多个状态,存储的时候转换为int类型存储。
二进制字段值
十进制的值,代表了二进制的位置,对应不同的状态。
多个状态的组合,二进制转为十进制:
二进制和十进制转换8421码
sql查询
1)是否包含:&与运算符,比如:(3&2)=2
2)组装:&与运算符,比如 6&3=3
字段扩展
二进制字段值
查询示例:
发布和正常的产品:
# 单独某个状态的条件查询SELECT * FROM product where state & 1=1 and state & 2=2
or
# 单独某个状态的条件查询,不写等于,默认等于当前与(&)的值SELECT * FROM product where state & 1 and state & 2
or
# 组合状态,必须写等于。否则无效SELECT * FROM product where state & 3=3
正常和不发布的产品:
# 组合状态,必须写等于。SELECT * FROM product where state & 1=1 and state & 2=0
程序里面的状态控制
程序里面的状态控制使用int类型(十进制),包括查询、更新等