`

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

    博客分类:
  • 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
分享到:
评论

相关推荐

    .net 运用二进制位运算进行数据库权限管理

    在计算机中,数据以二进制形式存储,每个位(bit)可以是0或1。位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()和右移(>>)。这些运算符可以直接作用于整数的每一位,从而实现对...

    二进制位

    例如,位字段(bit field)是一种在数据库中存储多位值的有效方法,它可以将多个布尔型变量紧凑地存储在一起。在网络通信中,TCP/IP协议头就包含了各种二进制标志,用于指示连接的状态和控制信息。 总之,二进制位...

    ArcGIS教程:地理数据库属性表基础知识

    BLOB类型用于存储二进制大对象,如图像或CAD数据;而全局唯一标识符(GUID)则用于唯一标识地理数据库中的元素,常用于管理关系和版本控制。 扩展表的功能进一步增强了属性表的实用性。属性域限制了列中可输入的值...

    PB位操作函数

    一个位代表二进制数的0或1,而多个位组合起来就构成了字节、字、双字等数据类型。位操作函数通常包括以下几种: 1. **位设置**:将指定位置的位设置为1,如`SetBit()`函数,允许开发者将一个特定的位设置为高电平...

    数据库系统工程师知识点总结

    数据库系统工程师知识点总结...海明码采用多位校验码的方式,在这些多个校验位中的每一位都对不同的信息数据位进行奇偶校验,通过合理地安排每个校验位对原始数据进行校验的位组合,可以达到发现错误、纠正错误的目的。

    数据库教程第二章数据库基本概念.ppt

    * 主键:主键是表中的一个或多个列,用于唯一标识每一行。 函数和运算符 * 数值函数:如SIN、COS、SIGN等。 * 字符函数:如LENGTH、UPPER、LOWER、INITCAP等。 * 日期函数:如SYSDATE、ADD_MONTHS、MONTHS_BETWEEN...

    全国计算机等级考试一级B模拟试题及答案(二)汇总.pdf

    5. 计算机内部数制:计算机内部采用二进制数制,因为二进制运算简单且适合逻辑操作。 6. ASCII码:ASCII码按照从小到大的顺序是数字、英文大写字母、英文小写字母,分别对应4组不同的字符集。 7. 二进制数的表示:...

    软考-数据库系统工程师(学习笔记)

    通过在数据位中加入多个校验位,使得每个校验位对应一组数据位的奇偶校验,从而实现错误检测和纠正功能。 以上是软考数据库系统工程师考试中关于计算机系统知识的重要考点,理解并掌握这些知识点对于通过考试至关...

    数据库设计的一个相对实用的权限验证设计方法

    当验证用户权限时,系统会获取文章的`read`字段值,然后遍历用户的角色,对每个角色的二进制值与文章的`read`字段值进行按位或运算。如果结果等于文章的`read`字段值,说明用户具有该权限。这种方法简化了数据表结构...

    江苏专转本计算机真题及答案(完整版)资料.doc

    8. ASCII码:标准ASCII码使用7位二进制编码,存储8个字符需要8个字节,因为每个字节包含7位数据位和1位校验位或填充位。 9. 矢量图形:矢量图形的获取通常涉及图像扫描、色彩分离、取样和量化等步骤,以便数字化...

    全国计算机等级考试一级B模拟试题及答案二汇总.pdf

    5. 计算机内部数制:计算机内部采用二进制数制,因为二进制运算简单且适合逻辑运算。 6. ASCII码:ASCII码是字符编码标准,按从小到大的顺序为数字、英文大写字母、英文小写字母。 7. 二进制数的表示范围:6位无...

    php 数据库字段复用的基本原理与示例

    这种技术通常涉及到将多个标志或状态编码在一个单一的整数字段中,利用二进制运算来提取和设置这些状态。以下是关于这一主题的详细解释: 一、逻辑代数基础 在计算机科学中,逻辑代数是二进制运算的基础,它由三个...

    全国计算机等级考试一级B模拟试题及答1.pdf

    5. 计算机内部数制:计算机内部采用二进制,因为二进制运算简单且适合逻辑运算。 6. ASCII码:ASCII码是字符编码标准,按数值从小到大的顺序是数字、大写字母、小写字母。 7. 无符号二进制数:6位无符号二进制最大...

    软考学习笔记-数据库工程师

    - **二进制到八进制**:整数部分从个位起每三位一组转换为八进制数,不足三位的前面补零;小数部分从小数点开始每三位一组进行转换。 - **八进制到二进制**:每位八进制数直接转换为三位二进制数。 - **二进制到...

    全国计算机等级考试一级B模拟试题及答案(二)(20211009113738).pdf

    5. 计算机内部数制:计算机内部使用二进制,因为二进制运算简单且适合逻辑操作。 6. ASCII码排序:ASCII码从小到大的顺序是数字、英文大写字母、英文小写字母。 7. 无符号二进制数:6位无符号二进制数的最大值是...

    2017江苏专转本计算机真题和答案解析.doc

    13. **二进制位数需求**:表示0到512(含)的无符号整数,至少需要9位二进制位。 14. **数制转换**:八进制数转换为十六进制数可能会有精度损失,因为它们的基数不同。 15. **二进制或运算**:0100 1101 V 0011 ...

Global site tag (gtag.js) - Google Analytics