Re: [讨论] 复选值的储存方式与比对

楼主: liaosankai (低温烘焙)   2014-08-30 13:29:13
※ 引述《JYHuang (夏天到了,冷不起来了说)》之铭言:
: 网页上不管是checkbox或是multi-select,要将所选的值存入数据库。
: 目前想到的方式有两种
: 一种是在数据库开个表存主键和值。
: 一个是用php的serialize(或是implode)转成字串存在字段。
: 前者比较直觉,SQL搜寻也比较容易(用WHERE `field` IN (A,B) 就好)
: 不过如果有一堆选项的话要开一堆表(或单一表用键值隔开)
: 在用POST更新时 除非是一次全部洗掉重加
: 也需要判断(存在的取消,不在的新增)之类的情类的。
: 后者比较省数据库的空间
: 不过搜寻跟比对上比较麻烦(要用 `field` like A or `field` like B
: 单笔更新的话也是整栏要洗掉重丢值
: 取值时则是要先判断是否能够unserialize.
: 除了这两种方式外
: 不知各位还有什么样的作法?
: 用enum,set?
: 其实还是有点不清楚SET属性字段如何作复数值的条件搜寻
先说明一下 MySQL 的 enum 和 set 两种资料类型。
1) 两种都是以“字串”方式储存资料,差在数据库会先帮你做检查。
2) 两种最多只能设定 64 组选项。
3) 设定字段为 enum('male','female') 时,资料只能为'male'或'female'
选项中的其中一个,相当于 HTML 中的 radio。
4) 设定字段为 set('red','green','blue') 时,资料为选项用逗号隔开
的字串组合。例如 'red,green' 或 'green' 或 'blue,red',相当于 HTML
中的 checkbox。
其中 set 有几个特性,
1) 一个是资料写入前,系统会自动把资料重新排序,像是 'blue,red'
就会重新被调整为 'red,blue' 再储存。
2) 如果写入的资料有重复的部分,会自动移除。像 'red,green,red,blue' 就
会被修正为 'red,green,blue'
3) 如果写入的资料含有不存在的选项,也会自动移除。像 'red,yellow,blue'
就会被修正为 'red,blue'
4) 另一个是 set 可接受选项以“2 的{顺序}次方”总合码(sum)来表示选项组合。
(2的0次方) red => 1,
(2的1次方) green => 2,
(2的2次方) blue => 4, ... 以此类推
当我想设定 'red,blue' 时,也可以直接设定数字 5 (1+4)
同理当我设定数字 7 时,表示为 'red,green,blue'。而且这个规则也可以
用在 WHERE 条件,像是 color = 3 和 color = 'red,green' 会是一样的。
5) MySQL 有一个针对 set 的搜寻语法 FIND_IN_SET
以上经验分享
作者: reso   2014-08-30 13:34:00
谢谢
作者: JYHuang (夏天到了,冷不起来了说)   2014-09-01 09:01:00
感谢分享,相当实用的文章
作者: KawasumiMai (さあ、死ぬがいい)   2014-09-01 10:42:00
超酷
作者: oread168 (大地的精靈R)   2014-09-01 15:27:00
实用

Links booklink

Contact Us: admin [ a t ] ucptt.com