背景
当我们有个需求,有一个多项选择题的答案保存到数据库。
我们按照一般的思维,就是做多几个字段去存这些多项选这题。
例子
例如:
有一个多项选择题,
问题:你觉得广东哪些城市好玩?
A.东莞市
B.广州市
C.中山市
D.珠海市
E.茂名市
F.深圳市
按照一般思维,我们在数据库中设计6个字段,A/B/C/D/E/F,然后保存在数据库,谁选择了A,就把A对应的字段值存入数据库。
比如,我选择了B/C/D,表数据如下:
FieldA | FieldB | FieldC | FieldD | FieldE | FieldF | ||
0 | 1 | 1 | 1 | 0 | 0 |
这样虽然清楚,但是浪费表资源的同时,当数据量多,造成查询数据低下的效果。
异或
下面,我们来介绍,如何用异或来存多项选择题。
我们首先定义选择题答案的枚举:
//城市枚举 public enum CityPlay { DongGuang = 1 << 0,//东莞 GuangZhou = 1 << 1,//广州 ZhongShan = 1 << 2,//中山 ZhuHai = 1 << 3,//珠海 MaoMing = 1 << 4,//茂名 ShenZheng = 1 << 5//深圳 }
在表中,我们只存一个字段(整型)
Field |
如果,选择了B/C/D,做B/C/D的按位或运算,存入数据库:
CityPlay.GuangZhou | CityPlay.ZhongShan | CityPlay.ZhuHai
值等于14,存入数据库。
那我们怎么知道用户选择了哪几个题呢?
很简单,做或运算,
比如是否选择了B? 很简单,把值与B的枚举做一次按位与运算,等于0就是没选择,其余选择
CityPlay.GuangZhou & 14 == 0? N:Y
其他选项以此类推。
alunchen