关于工作中一次二进制在实际业务中应用的思路放飞

         最近工作中遇到一个有关二进制的问题。不是什么技术难题,就是解决思路的问题。我觉得比较有意思,就记录下来。
  

需求描述

数据对外提供了三种访问方式

第一种:批量发送

第二种:文件发送

第三种:数据库直接获取

需求文档规定,用8位二进制表示

批量发送=10000000,

文件发送=01000000,

数据库直接获取=00100000

但是数据库里的存储方式是这样的,某条记录对外提供的访问方式是前两种,则数据库里字段servMode存的是11000000;

如果是对外提供后2中访问方式,则存的是01100000

扫描二维码关注公众号,回复: 14904873 查看本文章

如果是对外提供3种访问方式,则存的是11100000

如果数据对外提供只有第二种访问方式,则是01000000

用户如果查询对外提供批量发送和文件发送的记录,则前端传给后台的入参是一个数组,结构如下:["10000000","01000000"]。那么就需要把数据库里servMode字段值第一位或第二位是1的记录都查询到。即把10000000,01000000,11000000,10100000,01100000,11100000的记录都查询到

到这里需求描述完了,各位可以看看有如果实现这个查询功能。

思路放飞

我起初是把入参的的元素进行或运算,比如入参是["10000000","01000000"]

那么经过或运算后是11000000,然后在查询数据库,这样可以把数据库里是11000000的记录查询到,但是无法查询到10000000和01000000、11100000的记录。不符合业务需求。

后来就开始了思路的放飞,可以看出这不是一个技术问题,而是一个思路问题,如果思路正确,就可以解决了。什么模糊查询,sql中字符串截取都没找到合适的解决方案。

解决方案

首先,数据库存储的这些二进制可以通过数据库提供的函数转换成十进制。

00100000=32

01000000=64

10000000=128

01100000=96

10100000=160

11000000=192

11100000=224

其次,把前端入参数组中的元素转十进制,再求和sum。

比如,入参是[10000000,01000000],则sum=192,那么我只要把数据库里servMode字段转十进制后等于【128,64,96,160,192,224】的查询到即可。这样sql就简单多了,只要在java代码里多写几个if逻辑就行了。

比如:如果入参求和后sum=128,传给sql的参数list就是【128,160,192,224】,

          然后servMode in ('128','160','192','224')

还有一种解决方案,是我朋友提供的

思路如下:如果入参是[10000000,01000000],那么先拿第一个入参,获取到1在其中的位置,然后查询数据库里servMode中第一位是1的记录,然后再拿第二个入参,获取到1在其中的位置,在数据库 里查询第二位是1的记录,最后求并集。

这个也可以实现,但是有2个问题:一是会存在多次访问数据库,二是当每次访问数据库查询得到list比较大时,在求并集时涉及到list扩容和数据拷贝,也比较费时

我朋友的思路是利用sql中字符串解决来解决,我是把解决问题的方法交给了java代码。两个思路两个解决方案。

        最后,写这篇blog的主要目的是,记录这次思路的心理路程,在我们工作中不一定遇到的都是技术问题,还有就是解题思路的问题,技术问题可以在网上查找,但是和业务有关的非技术问题,比如思路问题就无法找到了,需要大家开动脑筋,放飞思路了.........

猜你喜欢

转载自blog.csdn.net/dhklsl/article/details/123457622