数据库多对多设计方案(贴标签的设计方案)
2017-03-08 21:09
393 查看
二进制数字的每一位表示一个标签,1 表示被贴了这个标签,0 表示未被贴这个标签。
同时,标签在表中的 ID 表示二进制中对应的位。举个例子:
标签表:
当要选择 标签-1 的商品时,可以通过位运算中的与运算(&),来获取二进制右起第一位为1的商品,偏移值 offset 为: 1<<(tag_id-1),当商品表中的 tag_id & offset 的结果与 offset 相等的时候,即得到了 标签-1 的商品,SQL 如下:
得到的结果:
当要选出 标签-1、标签-2,标签-3 的商品时,offset = (1<<(1-1))+(1<<(2-1))+(1<<(3-1)),SQL 如下:
得到结果:
通过这种方式,就可以抛弃掉关联表,直接通过位运算,获取到相应标签的数据。
同时,标签在表中的 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)
通过这种方式,就可以抛弃掉关联表,直接通过位运算,获取到相应标签的数据。
相关文章推荐
- 3种高效的Tags标签系统数据库设计方案分享
- 3种高效的Tags标签系统数据库设计方案分享
- 3种高效的Tags标签系统数据库设计方案分享
- 3种高效的Tags标签系统数据库设计方案分享
- 数据库优化设计方案(转)
- 数据库优化设计方案
- 数据库优化设计方案
- 数据库优化设计方案
- 数据库优化设计方案(转)
- 报表\标签\银行账单\票据\报表打印,预览,数据库联接,报表设计,输出,报表中间件,VC++源代码组件库
- 数据库优化设计方案
- 数据库优化设计方案(转)
- 报表/标签/银行账单/票据/报表打印,预览,数据库联接,报表设计,输出,报表中间件,VC++源代码组件库
- 有关语法数据库Clone的设计方案
- 数据库设计方案经典推荐
- 数据库优化设计方案
- 数据库优化设计方案
- 数据库优化设计方案
- 数据库优化设计方案(转)
- 数据库优化设计方案