我要存储会员信息
业务是多变的,需要存储多种标识。
如:
要标识会员是否是卖家,
要标识会员手机是否已认证
要标识会员是网站还是手机注册
。。。。
这些标识是互相独立,需要支持联合查询
一般的做法是针对每个标识做个字段
tinyint is_sell comment '1:卖家,0:买家'
tinyint mobile_auth comment '1:已认证,0:未认证'
tinyint regist_from comment '1:网站,2:手机'
要查 是卖家,手机已认证的
is_sell = 1 and mobile_auth = 1
问题
标识是随时可能增加的,这意味着字段也要增加,这显然是非常困难的。
解决办法
1.标识以2的次方设置,标识值相加以10进制存储在字段中
如:卖家标识是 2的0次方,1
手机认证是 2的1次方,2
来自手机注册 2的2次方 4
某会员是卖家,来自手机注册,1+4 = 5
存储在数据库标识字段值是:5
2.要查有卖家标识的会员
(5 & 1) == 1 ------> true
二进制与运算,返回值是该标识表明成立
101
001
-----
001
3.要查有卖家标识且手机认证的会员
(5 & (1+2)) == (1+2) ----> false
二进制与运算,返回值是几个标识的和表明成立
101
011
------
001
4.要查有卖家标识且或手机认证的会员
(5 & (2+4)) > 0 --------> true
二进制与运算,返回值大于零表明或关系成立
101
110
------
100
注意:
1. 在mysql中以long字段存储,可以存储2的64方的值,即最多可存储标识64个