数据库设计之复选框

技术 2016-08-18

最近在设计项目数据库的时候,遇到了关于复选框的字段设计,正好有这么一个个人博客,所以分享一下。

下面给出一个示例,然后通过不同的方法,来分析其利弊。

兴趣爱好:□足球 □篮球 □乒乓球 □游泳 □羽毛球 □跑步


当下比较流行的设计:

1、字符分割:
    利用下划线或者类似符号,将多个选项拼接。比如上例按顺序把checkbox的value设置为:zq、lq、ppq、yy、ymq、pb。
    然后比如我选择了足球、乒乓球、羽毛球,则把【zq_ppq_ymq】存入数据库字段中,下次在做展现的时候,则把该字段用下
    划线split一下,再去循环匹配。

2、置位符:
    利用类似二进制的数组,记录个选项的勾选状态,比如我依然选择了足球、乒乓球、羽毛球,则把【101010】放入数据库字  
    段中,下次在做展现的时候,则把该字段转为byte数组,然后循环判断,如果为1则为勾选,为0则为未勾选。

3、与运算:
    利用了与运算的特性,完成判断勾选。首先分别将示例中复选框的value依次设置为:
    □足球(2) □篮球(4) □乒乓球(8) □游泳(16) □羽毛球(32) □跑步(64)
    规律为依次使用2的N次幂,然后比如我依然选择了足球、乒乓球、羽毛球,则把勾选的选项value之和 2+8+32=【42】存入
    数据库字段中,下次在做展现的时候,则把复选框的DOM对象循环,用value和数据库字段中的值做与运算(&),如果结果大于
    0则为勾选,等于0为未勾选。
    比如 42&2=2 >0 则足球为勾选; 42&16=0 =0 则游泳为未勾选。

总结三种比较流行的方法,
法1在处理选项较多的时候,略显吃力,如果想要见名知意,估计20个选项,就可以达到100多个字符,不管是split还是去equals都会很影响程序速度。
法2的弊端在于拓展性很低,每次增加新的选项,都要去通表update,这本身是违反维护原则的。
法3相比至下,弥补了以上两个弊端,但是也有不足之处,因为需要遍历所有选项,所以在选项多的时候,可能会造成程序的缓慢,但是好在只是执行的都是计算机最喜欢的循环运算和数学运算,相比法1的split和equals这些字符串操作来说,效率高了不少。

楼主残忍的关闭了评论