您的位置:首页 > 数据库

数据库多对多设计方案(贴标签的设计方案)

2017-03-08 21:09 393 查看
二进制数字的每一位表示一个标签,1 表示被贴了这个标签,0 表示未被贴这个标签。
同时,标签在表中的 ID 表示二进制中对应的位。举个例子:
标签表:

tag_id    tag_name
1           标签-1
2           标签-2
3           标签-3
商品表:
goods_id    tag_id(二进制,省略前置0)
1                1(1)
2               3(11)
3               5(101)
4               6(110)
5               7(111)
6               4(100)

当要选择 标签-1 的商品时,可以通过位运算中的与运算(&),来获取二进制右起第一位为1的商品,偏移值 offset 为: 1<<(tag_id-1),当商品表中的 tag_id & offset 的结果与 offset 相等的时候,即得到了 标签-1 的商品,SQL 如下:

SELECT * FROM `商品表` WHERE tag_id & (1<<(1-1))=1<<(1-1)

得到的结果:

goods_id    tag_id(二进制,省略前置0)
1                1(1)
2               3(11)
3               5(101)
5               7(111)

当要选出 标签-1、标签-2,标签-3 的商品时,offset = (1<<(1-1))+(1<<(2-1))+(1<<(3-1)),SQL 如下:

SELECT * FROM `商品表` WHERE tag_id & ((1<<(1-1))+(1<<(2-1))+(1<<(3-1)))=(1<<(1-1))+(1<<(2-1))+(1<<(3-1))

得到结果:

goods_id    tag_id(二进制,省略前置0)
5               7(111)

通过这种方式,就可以抛弃掉关联表,直接通过位运算,获取到相应标签的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息