曾经在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这种肯定就不再适合了....