一次生产上的灵感 二进制运算思路
二进制 0 和 1,曾经刷过一些算法,也经常遇到需要使用01解决问题的算法。刷过一些OJ,对二进制的使用有一些了解。但在实际项目中从未使用过二进制的特性,最近公司生产遇到过这样一个问题,于是突发灵感使用二进制设计。
问题:在数据库一张表有这样一个字段用来区分这行数据,举个例子假如有个电商,可以通过 ios客户端, android客户端, 浏览器 三种方式访问该电商的商品。但这个电商很特殊经常只在某一端搞活动,假如该电商卖一款阿迪达斯的鞋子只在 ios客户端展示并可购买,但 android客户端,和浏览器压根就不展示这款阿迪达斯的鞋子,在商品表结构上设计需要一个字段(假设名为type)用来区分这个商品在某个终端是否展示。问题来了该怎么设计?
现在分析下商品可能展示的部分情况:
ios客户端 展示, android客户端 不展示, 浏览器不展示 type存储 '1'
ios客户端 展示, android客户端 展示, 浏览器不展示 type存储 '1,2'
ios客户端 不展示, android客户端 展示, 浏览器不展示 type存储 '3'
我看公司之前的表结构设计使用varchar类型存储type,使用like模糊查询进行匹配。
问题来了:
1》我们知道使用模糊查询‘%’和‘_’开头的前缀字符串是无法使用索引的
2》假如使用like '%2,3%'匹配所有android客户端, 浏览器 而数据库存储的是 '3,2' 那么是无论如何也查不出来的
使用 & 和 | 运算 思路来解决,type为整型存储
ios客户端 1 001
android客户端 2 010
浏览器 4 100
ios客户端 展示, android客户端 不展示, 浏览器不展示 type存储 1
ios客户端 展示, android客户端 展示, 浏览器不展示 type存储 3 = 1 | 2
ios客户端 不展示, android客户端 展示, 浏览器不展示 type存储 2
那么当SQL语句where条件是如何匹配,
查询ios客户端展示的 where 1 = type & 1
查询ios客户端和android客户端 同时展示的 where 3 = type & 3
并且使用二进制思路进行存储type还可以使用索引,不会出现顺序出错无法匹配问题。我们都知道字符串匹配是有空间和时间复杂度的有的是时间换空间,有的是空间换时间不管怎样的算法,时间和空间复杂度都不会小于O(n)。而使用二进制思路时间和空间复杂度都是O(1), 只进行一次CPU位运算,复杂度可以忽略不计。