`

二进制位运算标识数据库多个属性

    博客分类:
  • java
阅读更多
最近在对公司以前的一个项目进行调整时发现,数据库中有很多表示“多选状态标识”的字段。“多选状态标识”可能描述的并不十分准确,在这里用我们项目中的几个例子进行说明一下。
      例一:表示某个商家是否支持多种会员卡打折(如有金卡、银卡、其他卡等),项目中的以往的做法是:在每条商家记录中为每种会员卡建立一个标志位字段。如图:



      其中蓝色区域的三个整形字段分别表示三种会员卡。当值为“1”时表示当前商家支持这种会员卡打折,反之“0”则表示不支持。

      例二:表示系统字典表中某种类型方式,会在哪个功能模块中调用。如某种“支付方式”可能在“收银模块”中会用到,在“结算模块”中也会用到。如图:





      用多字段来表示“多选标识”存在一定的缺点:首先这种设置方式很明显不符合数据库设计第一范式,增加了数据冗余和存储空间。再者,当业务发生变化时,不利于灵活调整。比如,增加了一种新的会员卡类型时,需要在数据表中增加一个新的字段,以适应需求的变化。

      因此,我们在重新审视数据库设计时,我的一位同事提出了一种代替方式:将多个状态标识字段合并成一个字段,并把这个字段改成字符串型,对多选状态值以字符串数组的方式保存(一个以逗号分隔的字符串:“1,2,3”)。表的结构变成如下:




     “MEMBERCARD”字段中,当存在“1”时表示支持金卡打折,“2”时表示支持银卡打折,“3”表示支持其他卡打折。
      这样调整的好处,不仅消除相同字段的冗余,而且当增加新的会员卡类别时,不需增加新的字段。但带来新的问题:在数据查询时,需要对字符串进行分隔。并且字符串类型的字段在查询效率和存储空间上不如整型字段。

      总的来说,上面调整的思路是正确的,但不够自然。我后来考虑了一下,觉得可以用“位”来解决这个问题:二进制的“位”本来就有表示状态的作用。可以用下面各个位来分别表示不同种类的会员卡打折支持:



      这样,“MEMBERCARD”字段仍采用整型。当某个商家支持金卡打折时,则保存“1(0001)”,支持银卡时,则保存“2(0010)”,两种都支持,则保存“3(0011)”。其他类似。表结构如图:




我们在编写SQL语句时,只需要通过“位”的与运算,就能简单的查询出想要数据:
[java] view plaincopy
//查询支持金卡打折的商家信息: 
select * from factory where MEMBERCARD & b'0001' 
或者: 
select * from factory where MEMBERCARD & 1 
 
//查询支持银卡打折的商家信息: 
select * from factory where MEMBERCARD & b'0010' 
或者: 
Select * from factory where MEMBERCARD & 2 


      通过这样的处理方式既节省存储空间,查询时又简单方便。以上sql语句为MySQL的语法,其他数据库方法类似。并且“b'0010'”二进制的表示方式的语法是在5.0以后的版本才有。


      注意:这种情况不同于在多种状态中只可能处于一种状态的情况,如性别等。

原文:http://blog.csdn.net/caomiao2006/article/details/22655827

十进制转换二进制:
http://jingyan.baidu.com/article/fc07f9892e245612ffe51909.html

位运算规则:
http://www.cnblogs.com/meng72ndsc/archive/2010/12/19/1910881.html
分享到:
评论

相关推荐

    计算机应用基础全套电子完整版204页.pptx

    2、书写格式 在数字后面加相应的英文字母作为标识 123AH 111B 77Q 在括号外面加数字下标: (10201)8 (263)10 (3DF6)16 常用进制转换表 四种进制数的对应关系 十进制数 二进制数 八进制数 十六进制数 十进制数...

    云南省初中信息技术会考复习

    9、我们把二进制信息的一个数位叫作一个比特(Bit),它是计算机处理信息的最小单位。 10、多媒体信息编码:图像、声音、视频等多媒体信息要通过采样、压缩等手段进行数字化。 11、信息需求的分析包括:确定信息获取...

    C#开发经验技巧宝典

    0976 将图片以二进制格式存储到数据库中(asp.net) 569 0977 从DataReader对象读取数据的技巧 569 0978 随机显示数据库记录 569 0979 通过DataTable获得数据表的主键 569 0980 将Access数据库转化为SQL ...

    2018年川大《计算机应用基础》第一次作业.doc

    数以16位二进制数表示 B. 数以十六进制来表示 C. 可处理16个字符串 D. 数以两个八进制表示 21. 在对磁盘及其驱动器的叙述中有许多专用术语,而与其无关的是______。 A. 密度 B. 磁道 C. 扇区 D. 光标 22. 二进制数...

    Visual Basic 6编程技术大全 中译本扫描版带书签 2/2

    5.5.6二进制文件的处理169 5.5.7 FileSystemObject分层结构171 5.6与Windows交互178 5.6.1 App对象178 5.6.2 Clipboard对象180 5.6.3 Printer对象184 5.6.4运行其他应用程序186 5.6.5展示Help188 第6章类与对象191 ...

    Visual Basic 6编程技术大全 中译本扫描版带书签 1/2

    5.5.6二进制文件的处理169 5.5.7 FileSystemObject分层结构171 5.6与Windows交互178 5.6.1 App对象178 5.6.2 Clipboard对象180 5.6.3 Printer对象184 5.6.4运行其他应用程序186 5.6.5展示Help188 第6章类与对象191 ...

    C#编程经验技巧宝典

    58 <br>0081 文本中首字母改为大写 59 <br>0082 C#随机数的产生 59 <br>0083 身份证从15位升至18位算法 60 <br>0084 十进制数转二进制数的算法 60 <br>0085 十进制数转八进制数的算法 61...

    会计理论考试题

    A、模拟信息 B、模拟信息或数字信息 C、数字形式D、二进制形式的数字 6.在Windows98中,要恢复回收站中的文件,只要___B____。 A、双击该文件 B、用鼠标把该文件施出回收站 C、单击该文件 D、A、B、C均可 7.在...

    轻松学C#(图解版)

    第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类型标识、反射、特性、泛型、LINQ和数据库开发等。 =======================================...

    C 语言编程常见问题解答.chm

    4.6 文本模式(text mode)和二进制模式(binary mode)有什么区别? 4.7 怎样判断是使用流函数还是使用低级函数? 4.8 怎样列出某个目录下的文件? 4.9 怎样列出—个文件的日期和时间? 4.10 怎样对某个目录下的...

    C语言编程要点

    4.6. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 61 4.7. 怎样判断是使用流函数还是使用低级函数? 62 4.8. 怎样列出某个目录下的文件? 62 4.9. 怎样列出一个文件的日期和时间? 63 4.10. 怎样对某个目录...

    南开大学《大学计算机基础》在线作业04.docx

    A:字段的另一种说法 B:决定字段能包含哪类数据的设置 C:一类数据库应用程序 D:一类用来描述Access表向导允许从中选择的字段名称 参考选项:B 在Internet中,用来唯一标识主机的一串二进制地址是( )。 A:主页 B:...

    SQL语法大全

    这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。 CursorType Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括...

    中职计算机应用基础新PPT教案.pptx

    计算机内部采用二进制运算,数值计算非常精确,一般有效数字可以达到十几位。 (3)具有记忆和逻辑判断功能。计算机的存储设备可以把原始数据、中间结果、计算结果、程序执行过程等信息存储起来供再次使用。存储能力取...

    华为编程开发规范与案例

    11群是四个群中最小的群,其中继计次表位于缓冲区的首位,打完电话后查询内存发现出中继群号在内存中是正确的,取完话单后再查就不正确了。 结 论: 话单池的一个备份指针Pool_head_1和中继计次表的头指针重合,...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅...

    易语言 茶凉专用模块

    子程序 到任意进制, 文本型, 公开, 可以将从二进制到三十六进制的数值随意进行转换(返回转换后的文本) .参数 被转换文本, 文本型, , 欲被转换的文本(不可以转换负数以及小数) .参数 被转换进制, 整数型, , 被转换...

Global site tag (gtag.js) - Google Analytics