- 浏览: 323381 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (254)
- java (178)
- tomcat (6)
- 邮件 (1)
- smtp (1)
- Linux (2)
- 编码 (2)
- 导入工程 (1)
- Specification Level (1)
- hibernate (10)
- 字段类型 (1)
- 字段类型匹配 (1)
- 数据库 (3)
- sql (9)
- struts2 (8)
- 类型转换 (2)
- java,MyEclipse,SVN (1)
- Myecplise (4)
- 输入校验 (1)
- JFrame (2)
- Oracle (8)
- google (1)
- Swing (3)
- Fusioncharts (1)
- 找工作 (0)
- js (4)
- jsp (11)
- displaytag (1)
- spring (8)
- 工作 (1)
- String (1)
- 算法 (2)
- IO (1)
- xml (3)
- 设计模式 (1)
- UML (1)
- 文档 (1)
- ajax (1)
- 日常 (7)
- sql server (1)
- mysql (3)
- git (1)
- Maven (1)
- mongodb (1)
- postman (1)
最新评论
最近在对公司以前的一个项目进行调整时发现,数据库中有很多表示“多选状态标识”的字段。“多选状态标识”可能描述的并不十分准确,在这里用我们项目中的几个例子进行说明一下。
例一:表示某个商家是否支持多种会员卡打折(如有金卡、银卡、其他卡等),项目中的以往的做法是:在每条商家记录中为每种会员卡建立一个标志位字段。如图:
其中蓝色区域的三个整形字段分别表示三种会员卡。当值为“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
例一:表示某个商家是否支持多种会员卡打折(如有金卡、银卡、其他卡等),项目中的以往的做法是:在每条商家记录中为每种会员卡建立一个标志位字段。如图:
其中蓝色区域的三个整形字段分别表示三种会员卡。当值为“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
发表评论
-
领域精通涉及技术点(不分先后)
2017-12-20 19:35 618Java8 netty jvm kafaka消息队列 上传下载 ... -
计算机各种单位讲解及换算
2017-12-13 13:54 1635我还听过有UK的 一、最小单位:位(bit,缩写为b) 在原 ... -
JAVA字符串格式化-String.format()和MessageFormat的使用
2017-12-05 10:39 1439String.format()常规类型的格式化 Stri ... -
eclipse启动项目常见问题
2017-11-16 17:46 1180今儿遇到了个问题,ecli ... -
字符编码笔记:ASCII,Unicode和UTF-8
2017-10-23 16:37 456讲的太牛逼了: http://ww ... -
emoji简单讲解
2017-10-23 15:17 972emoji处理方式大起底 http://blog.csdn.n ... -
BigDecimal讲解
2017-10-12 15:58 442BigDecimal 由任意精度的整数非标度值 和 32 位的 ... -
eclips 控制台console上不打印信息
2017-09-06 21:53 5791、进windows菜单 -> show view -& ... -
详解RequestMappingHandlerMapping和RequestMappingHandlerAdapter
2017-08-29 17:08 2967http://donald-draper.iteye.com/ ... -
用@ExceptionHandler 来进行切面异常处理
2017-08-29 11:47 2307有时候我们想处理某个类里Controller中抛出的异常怎么搞 ... -
Spring 注解@Component、@Repository、@Service、@Controller区别
2017-08-28 15:27 1011spring 2.5 中除了提供 @Com ... -
线程的一点小总结
2017-08-23 20:36 706java中main方法启动的是一个进程还是一个线程? 答:是一 ... -
线程池
2017-08-23 17:35 520诸如Web 服务器、数据库 ... -
Class源码大概讲解
2017-08-23 16:47 507http://blog.csdn.net/a327369238 ... -
Spring 事务相关
2017-08-14 12:10 471Transactionz注解的readOnly ... -
把时间当做朋友-前言
2017-08-13 20:47 403要管理的不是时间,而是自己。人们生活在同一个世界,却又各自 ... -
单例里面的方法讲解
2017-08-11 14:55 487spring里的controller是单例的。系统针对每个co ... -
eclipse拷贝出来的项目名称还是原来的
2017-07-26 16:46 1078需要修改的有如下几个地方: 1、pom.xml里面打包的名字一 ... -
自定义hibernate方言,新增自定义函数
2017-06-27 10:47 876按位与运算(&)在许多数据库中都是支持的,遗憾的是,H ... -
http请求参数:header body paramter三种参数区别、联系
2017-06-19 10:46 488812345
相关推荐
在计算机中,数据以二进制形式存储,每个位(bit)可以是0或1。位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()和右移(>>)。这些运算符可以直接作用于整数的每一位,从而实现对...
例如,位字段(bit field)是一种在数据库中存储多位值的有效方法,它可以将多个布尔型变量紧凑地存储在一起。在网络通信中,TCP/IP协议头就包含了各种二进制标志,用于指示连接的状态和控制信息。 总之,二进制位...
BLOB类型用于存储二进制大对象,如图像或CAD数据;而全局唯一标识符(GUID)则用于唯一标识地理数据库中的元素,常用于管理关系和版本控制。 扩展表的功能进一步增强了属性表的实用性。属性域限制了列中可输入的值...
一个位代表二进制数的0或1,而多个位组合起来就构成了字节、字、双字等数据类型。位操作函数通常包括以下几种: 1. **位设置**:将指定位置的位设置为1,如`SetBit()`函数,允许开发者将一个特定的位设置为高电平...
数据库系统工程师知识点总结...海明码采用多位校验码的方式,在这些多个校验位中的每一位都对不同的信息数据位进行奇偶校验,通过合理地安排每个校验位对原始数据进行校验的位组合,可以达到发现错误、纠正错误的目的。
* 主键:主键是表中的一个或多个列,用于唯一标识每一行。 函数和运算符 * 数值函数:如SIN、COS、SIGN等。 * 字符函数:如LENGTH、UPPER、LOWER、INITCAP等。 * 日期函数:如SYSDATE、ADD_MONTHS、MONTHS_BETWEEN...
5. 计算机内部数制:计算机内部采用二进制数制,因为二进制运算简单且适合逻辑操作。 6. ASCII码:ASCII码按照从小到大的顺序是数字、英文大写字母、英文小写字母,分别对应4组不同的字符集。 7. 二进制数的表示:...
通过在数据位中加入多个校验位,使得每个校验位对应一组数据位的奇偶校验,从而实现错误检测和纠正功能。 以上是软考数据库系统工程师考试中关于计算机系统知识的重要考点,理解并掌握这些知识点对于通过考试至关...
当验证用户权限时,系统会获取文章的`read`字段值,然后遍历用户的角色,对每个角色的二进制值与文章的`read`字段值进行按位或运算。如果结果等于文章的`read`字段值,说明用户具有该权限。这种方法简化了数据表结构...
8. ASCII码:标准ASCII码使用7位二进制编码,存储8个字符需要8个字节,因为每个字节包含7位数据位和1位校验位或填充位。 9. 矢量图形:矢量图形的获取通常涉及图像扫描、色彩分离、取样和量化等步骤,以便数字化...
5. 计算机内部数制:计算机内部采用二进制数制,因为二进制运算简单且适合逻辑运算。 6. ASCII码:ASCII码是字符编码标准,按从小到大的顺序为数字、英文大写字母、英文小写字母。 7. 二进制数的表示范围:6位无...
这种技术通常涉及到将多个标志或状态编码在一个单一的整数字段中,利用二进制运算来提取和设置这些状态。以下是关于这一主题的详细解释: 一、逻辑代数基础 在计算机科学中,逻辑代数是二进制运算的基础,它由三个...
5. 计算机内部数制:计算机内部采用二进制,因为二进制运算简单且适合逻辑运算。 6. ASCII码:ASCII码是字符编码标准,按数值从小到大的顺序是数字、大写字母、小写字母。 7. 无符号二进制数:6位无符号二进制最大...
- **二进制到八进制**:整数部分从个位起每三位一组转换为八进制数,不足三位的前面补零;小数部分从小数点开始每三位一组进行转换。 - **八进制到二进制**:每位八进制数直接转换为三位二进制数。 - **二进制到...
5. 计算机内部数制:计算机内部使用二进制,因为二进制运算简单且适合逻辑操作。 6. ASCII码排序:ASCII码从小到大的顺序是数字、英文大写字母、英文小写字母。 7. 无符号二进制数:6位无符号二进制数的最大值是...
13. **二进制位数需求**:表示0到512(含)的无符号整数,至少需要9位二进制位。 14. **数制转换**:八进制数转换为十六进制数可能会有精度损失,因为它们的基数不同。 15. **二进制或运算**:0100 1101 V 0011 ...