美文网首页
使用二进制的方式存储多条件的业务

使用二进制的方式存储多条件的业务

作者: 输入昵称就行 | 来源:发表于2020-09-11 16:11 被阅读0次

    在业务开发中,有的时候会碰到这样的需求,一个对象要生效,会有各种各样的条件,而这些条件又只有之分,如果我们每个条件都用一个字段的话,那么数据库保存的时候需要对应给每个条件都加一个字段,这样也不是不可以,一般这种也是比较常见的做法,但是如果比较多,但是又有拓展的可能,那么是否可以考虑另一种方式来存储,也值得考虑。

    本文介绍一种基于二进制的方式来存储这些条件,通过简单的java代码实现主要的逻辑。

    开始

    假如业务是支持的支付方式,比如有微信、支付宝、美团支付、抖音支付(听说要出了)、招商银行卡;

    创建一个枚举:

    public enum PayWayEnum {
    
        /**
         * 微信
         */
        TENCENT(0),
        /**
         * 支付宝
         */
        ALIPAY(1),
    
        /**
         * 抖音
         */
        BYTE_DANCE(2),
    
        /**
         * 美团
         */
        MEITUAN(3),
    
        /**
         * 招商银行
         */
        CMB(4),
        ;
    
        /**
         * 对应数据库存储的二进制位数
         */
        private int bit;
    
        PayWayEnum(int bit) {
            this.bit = bit;
        }
    
        public int getBit() {
            return bit;
        }
    
    }
    

    从业务的角度来讲,不外乎对这个字段的增改查

    工具类

    @UtilityClass
    public class BinaryUtil {
    
        /**
         * 验证二进制第bit位的结果
         *
         * @param binary 二进制值
         * @param bit    index 从0开始
         * @return true 为1 false 为0
         */
        public static boolean match(Integer binary, int bit) {
            int value = 1 << (bit);
            int i = value & binary;
            return i > 0;
        }
    
        /**
         *
         * 将二进制result的第bit位设置为bool的值
         * 一般用于修改
         * @param binary 二进制原始值
         * @param bit    index 从0开始
         * @param bool   要设置的值
         * @return 修改后的结果
         */
        public static Integer set(Integer binary, int bit, boolean bool) {
            if (bool) {
                int value = 1 << bit;
                return binary | value;
            } else {
                int value = ~(1 << bit);
                return binary & value;
            }
        }
    
        /**
         * 指定几位生产二进制
         * 用户创建
         * @param bits  设置某几位为1
         * @return 范围生成的二进制值
         */
        public static Integer accept(int[] bits) {
            int binary = 0;
            for (int bit : bits) {
                binary = set(binary, bit, true);
            }
            return binary;
        }
    
        /**
         * 字符串二进制1010101转为整数值
         *
         * @param binaryString
         * @return
         */
        public static Integer valueOf(String binaryString) {
            return Integer.valueOf(binaryString, 2);
        }
    
        /**
         * 将数字转为二进制字符串
         *
         * @param integer
         * @return
         */
        public static String toBinaryString(Integer integer) {
            return Integer.toBinaryString(integer);
        }
    }
    

    测试

        public static void main(String[] args) {
    
            // 初始化
            Integer accept = accept(new int[]{PayWayEnum.TENCENT.getBit(), PayWayEnum.ALIPAY.getBit()});
            System.out.println(toBinaryString(accept));
    
            // 验证是否支持微信支付
            String value = toBinaryString(accept);
            Integer integer = valueOf(value);
            boolean match = match(integer, PayWayEnum.TENCENT.getBit());
            System.out.println(match);
    
            // 设置支持美团支付
            Integer result = set(integer, PayWayEnum.MEITUAN.getBit(), true);
            System.out.println(result);
            String s = Integer.toBinaryString(result);
            System.out.println(s);
        }
    

    思考

    使用二进制的方式存储类似的这种业务数据,扩展性比较强,比如我需要再增加一个建行支付,直接增加一个枚举即可(如果将枚举改成字典那就更好了); 但是也有不好的地方,比如数据库值可读性不高,不方便使用sql批量更新数据,因为每个的值都会有不同,比如我某天增加了一个支付方式,我希望所有的商品都支持这种支付方式,这个时候其实就需要精细化更新了。

    总的来说这是一种思考的方向,具体还是要根据实际开发中的需要来使用不同的数据结构,没有万能药。

    相关文章

      网友评论

          本文标题:使用二进制的方式存储多条件的业务

          本文链接:https://www.haomeiwen.com/subject/zqhbektx.html