曾经在qq的日志里写过关于二进制在小型权限系统处理中的作用,这里就又从新整理了一下。

    编程中很多时候我们会遇到一种情况,一个对象有多种属性(就好比一个电影内容可以有爱情,动作,悬疑,科幻等)。总结了一下这个时候的几种情况:

  1. 如果这个对象只能选择这多种属性中的一种。

  当客户有种要求的时候,那么就很好处理的,只需定义一个字段以一个数字形式保存在数据库中即可。这个没什么好思考的。

   2. 如果这个对象可以同时具有多种属性。

  当对象有多个属性同时存在的时候,就我从网上看来的又可以分两种处理方法:

             第一种前后台经常需要根据属性搜索数据库(像搜索电影类型),这时候一般的可能就会在数据库中定义多个类型是布尔的字段,这种做法是相当简单的了,缺点就是当属性较多时,数据库维护很麻烦,但好处是在执行sql语句的时候很简单,找到属于哪一类产品只需要  字段名=true 即可。

             第二种前后台只进行修改和判断(像权限控制的时候),这时候通常的做法,数据库中定义一个字段,在保存的时候循环复选框,形成字符串(像“1,2,3”这种形式)然后保存在数据库中,在用到判断属性的地方,用split方法给分解成数组,然后来判断,再深入一点,就把这些分解判断的方法专门封装出来,放入逻辑类中,需要时调用即可,这样在数据相当庞大的时候数据库字段维护相对简单,缺点当然就是数据搜索的时候很是麻烦。   

        这两种情况是我们在开发过程中经常可能用到的了,怎样将二者的利弊折中呢,主要的问题就是多个属性怎么保存的问题,是一个属性一个字段表示还是一个字段对应多个属性,如果一个属性一个字段,那么数据库中就会多个字段,后者则一个字段。

       其实一个字段和多个字段的区别就在于:多个字段每个保存的信息单一控制时灵活,一个字段因为是带符号的字符串,虽然信息多但不容易检索,如果我们能够一个字段里信息简单但内容又能够分解出不同信息,岂不妙哉!

       当然大家可能会想到在数据库中保存成xml字段来进行处理,这个当然好,不过对于一些最多也就十几个的属性的对象来说专门再进行xml处理倒有点大材小用了。这个时候就能体会二进制的好处了。

     这里用四位二进制来举例:属性A=1(二进制:0001),属性B=2(二进制:0010),属性C=4(二进制:0100),属性D=8(二进制:1000)。我们假设一个对象有这四个属性

     现在把他们四个的二进制值进行或运算: 

     0  0  0  1         A               1

     0  0  1  0         B               2

     0  1  0  0         C               4 

     1  0  0  0         D               8

-----------------------------------------------------------------------

     1  1  1  1         或运算之后的值   15

如果我把这个15存入数据库

在前台我想知道该对象是否具有这个C属性,改怎么办呢,很简单:

把C的二进制值和15的二进制相与运算:

 

       0   1   0   0          4

  &    1   1   1   1          15

-------------------------------------

       0   1   0   0       =   4

   可以看到这个时候等于原值的

   那么我在数据库中如果想要知道所有包含C属性对象的集合

    Select * from tableName where 4 & columnName=4       即可

 

     至于在程序中怎么处理与或运算,就不再多说了,很简单的网上一搜一大堆。

   当然这个方法还是有局限的,例如现在int型为32位,那我们定义的时候注意不要超出32个值,为什么呢,因为这里所有的二进制,相同位上是不容许出现两个1的,如果出现   0001和0011这种肯定就不再适合了....