公告:
界面修改中,请凑合看
导航:
首页(11)
XML学习笔记(1)
PHP学习笔记(3)
杂七杂八(5)
网文一大筐(2)
日历:
«December 2025»
123456
78910111213
14151617181920
21222324252627
28293031
搜索:

日志更新:
免费点歌
看看你和哪个明星最像
PHP5 new Functions
我就不信邪!!!
又和老婆视频了
网络真是神奇啊
正则表达式[转载]
在一个字段里存储多个值的方法
SOHU社区的一篇文章——我奋斗了18年
昨天和老婆视频了
最新评论:
回复:看看你和哪个明星最像
回复:看看你和哪个明星最像
回复:我就不信邪!!!
回复:免费点歌
留言板:
签写新留言

友情链接

猪贝窝
哈米波波
恋之风景
本站信息:
blog名称:好好学习天天向上
日志总数:11
评论数量:10
留言数量:0
访问次数:90987
建立时间:2005年1月21日

大少爷 发表于 2005/1/31 3:54:54
 先举个比较简单的例子,比如做一个试卷系统,试卷题目分为单选题和多选题,可以用一个表来记录题干,一个表来记录选项,在记录选项的表中需要用一个字段来标明是多选还是单选。另外还得设计表格来记录答题情况,那么需不需要单选一个表,多选一个表呢?  考虑一下用来保存单选答案的表,一个字段记录答案ID,一个记录答案所属题目的ID,另外一个记录答题人的选项,用整型就可以了。但是多选呢,答题人可以选择多个答案,但设置多个字段表示是不可能的,因为题目的选项可以有很多,因此,答案中选择的选项也可能会有很多,用多个字段表示非常浪费空间。那么,也可以把答案序列化。多选的答案可以是一个数组,数组里面每一项都是对应于一个所选的选项,这样就可以把多选答案保存在一个字段里。  但是这么做很大的一个缺点就是,如果我想知道第一题选择A和B的都有谁,这就是个非常麻烦的问题了,需要把所有答卷读取出来,把他们分别解序列化,得到数组,然后比较。这样做耗费很多资源。  有一种方法,这其实是很常用的方法,就是利用位运算。对于多选的每个选项,我们按照2的k次幂来为它赋值,也就是说,对于一道题,第1个选项值为1,第2个选项值为2,第3个选项值为4,第k个选项值为2的k-1次幂。然后,对于答题人提交的答案,将所选的选项的值相加,保存到数据库中。数据库该字段设置为多少位的整型,就允许多少个选项出现在一道题中。既然单选和多选都是用整型来保存答案,那么干脆放到一个表里就可以了。查询的时候,利用位运算,要想知道有谁第一题选了第1项,那么用: SELECT * FROM anwser WHERE qid=1 AND choice & 1 如果想知道有谁选了第1项和第3项,就用: SELECT * FROM answer WHERE qid=1 AND choice & 1 AND choice & 4 就是说,选了第k项就是& 2的k-1次幂,当然,没有选第k项就是^ 2的k-1次幂,比如要想知道有谁选了第1项但没选第4项,那么: SELECT * FROM answer WHERE qid=1 AND choice & 1 AND choice ^ 8 使用这种方法既可以在一个字段保存多个值,又可以方便查询。

阅读全文(4538) | 回复(0) | 编辑 | 精华 | 分类:软件技术,  电脑与网络

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
 
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.313 second(s), page refreshed 144818082 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号