- 浏览: 315410 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 569Java8 netty jvm kafaka消息队列 上传下载 ... -
计算机各种单位讲解及换算
2017-12-13 13:54 1552我还听过有UK的 一、最小单位:位(bit,缩写为b) 在原 ... -
JAVA字符串格式化-String.format()和MessageFormat的使用
2017-12-05 10:39 1298String.format()常规类型的格式化 Stri ... -
eclipse启动项目常见问题
2017-11-16 17:46 1149今儿遇到了个问题,ecli ... -
字符编码笔记:ASCII,Unicode和UTF-8
2017-10-23 16:37 428讲的太牛逼了: http://ww ... -
emoji简单讲解
2017-10-23 15:17 925emoji处理方式大起底 http://blog.csdn.n ... -
BigDecimal讲解
2017-10-12 15:58 406BigDecimal 由任意精度的整数非标度值 和 32 位的 ... -
eclips 控制台console上不打印信息
2017-09-06 21:53 5461、进windows菜单 -> show view -& ... -
详解RequestMappingHandlerMapping和RequestMappingHandlerAdapter
2017-08-29 17:08 2917http://donald-draper.iteye.com/ ... -
用@ExceptionHandler 来进行切面异常处理
2017-08-29 11:47 2236有时候我们想处理某个类里Controller中抛出的异常怎么搞 ... -
Spring 注解@Component、@Repository、@Service、@Controller区别
2017-08-28 15:27 974spring 2.5 中除了提供 @Com ... -
线程的一点小总结
2017-08-23 20:36 670java中main方法启动的是一个进程还是一个线程? 答:是一 ... -
线程池
2017-08-23 17:35 485诸如Web 服务器、数据库 ... -
Class源码大概讲解
2017-08-23 16:47 479http://blog.csdn.net/a327369238 ... -
Spring 事务相关
2017-08-14 12:10 442Transactionz注解的readOnly ... -
把时间当做朋友-前言
2017-08-13 20:47 372要管理的不是时间,而是自己。人们生活在同一个世界,却又各自 ... -
单例里面的方法讲解
2017-08-11 14:55 463spring里的controller是单例的。系统针对每个co ... -
eclipse拷贝出来的项目名称还是原来的
2017-07-26 16:46 1036需要修改的有如下几个地方: 1、pom.xml里面打包的名字一 ... -
自定义hibernate方言,新增自定义函数
2017-06-27 10:47 847按位与运算(&)在许多数据库中都是支持的,遗憾的是,H ... -
http请求参数:header body paramter三种参数区别、联系
2017-06-19 10:46 478212345
相关推荐
2、书写格式 在数字后面加相应的英文字母作为标识 123AH 111B 77Q 在括号外面加数字下标: (10201)8 (263)10 (3DF6)16 常用进制转换表 四种进制数的对应关系 十进制数 二进制数 八进制数 十六进制数 十进制数...
9、我们把二进制信息的一个数位叫作一个比特(Bit),它是计算机处理信息的最小单位。 10、多媒体信息编码:图像、声音、视频等多媒体信息要通过采样、压缩等手段进行数字化。 11、信息需求的分析包括:确定信息获取...
0976 将图片以二进制格式存储到数据库中(asp.net) 569 0977 从DataReader对象读取数据的技巧 569 0978 随机显示数据库记录 569 0979 通过DataTable获得数据表的主键 569 0980 将Access数据库转化为SQL ...
数以16位二进制数表示 B. 数以十六进制来表示 C. 可处理16个字符串 D. 数以两个八进制表示 21. 在对磁盘及其驱动器的叙述中有许多专用术语,而与其无关的是______。 A. 密度 B. 磁道 C. 扇区 D. 光标 22. 二进制数...
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 ...
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 ...
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.在...
第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类型标识、反射、特性、泛型、LINQ和数据库开发等。 =======================================...
4.6 文本模式(text mode)和二进制模式(binary mode)有什么区别? 4.7 怎样判断是使用流函数还是使用低级函数? 4.8 怎样列出某个目录下的文件? 4.9 怎样列出—个文件的日期和时间? 4.10 怎样对某个目录下的...
4.6. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 61 4.7. 怎样判断是使用流函数还是使用低级函数? 62 4.8. 怎样列出某个目录下的文件? 62 4.9. 怎样列出一个文件的日期和时间? 63 4.10. 怎样对某个目录...
A:字段的另一种说法 B:决定字段能包含哪类数据的设置 C:一类数据库应用程序 D:一类用来描述Access表向导允许从中选择的字段名称 参考选项:B 在Internet中,用来唯一标识主机的一串二进制地址是( )。 A:主页 B:...
这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。 CursorType Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括...
计算机内部采用二进制运算,数值计算非常精确,一般有效数字可以达到十几位。 (3)具有记忆和逻辑判断功能。计算机的存储设备可以把原始数据、中间结果、计算结果、程序执行过程等信息存储起来供再次使用。存储能力取...
11群是四个群中最小的群,其中继计次表位于缓冲区的首位,打完电话后查询内存发现出中继群号在内存中是正确的,取完话单后再查就不正确了。 结 论: 话单池的一个备份指针Pool_head_1和中继计次表的头指针重合,...
与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅...
子程序 到任意进制, 文本型, 公开, 可以将从二进制到三十六进制的数值随意进行转换(返回转换后的文本) .参数 被转换文本, 文本型, , 欲被转换的文本(不可以转换负数以及小数) .参数 被转换进制, 整数型, , 被转换...