zoukankan      html  css  js  c++  java
  • PCB SQL SERVER 位运算应用实例

    在PCB行业,一个产品可能同时在多个工厂生产,举例:一个产品一条主记录,这条记录中会对应多个工厂的产地,而这个工厂产地个数不确定,

    那么如何设计表结构存储这个不确定的工厂呢?这里想到了4个方式存储

    一.主外键一对多的方式

          产品为主键,主表,而工厂放到外键,为副表,这样就可以实现一对多的方式。

    二.主表中,一个字段存放多个工厂产地

          在一个工厂产地中存放多个产地用,分隔;   如一个字段中存放:P1,P2,P3

    三.主表中,每个工厂对应一个字段

         比如:已知8个工厂,那么在主表建立8个工厂字段存放对应的工厂产地.

    四.主表中,一个字段存中存放工厂产地的枚举值      接下来就是以这种方式实现

         比如:P1工厂枚举值为1,     P2工厂枚举值为2, P3工厂枚举值为4

                     同时满足P1工厂,P2工厂,两个工厂  枚举值为3

                     同时满足P1工厂,P2工厂,P3工厂, ,  三个工厂  枚举值为7

    这里不讨论各种表结构数据存储方式或后续数据分析影响的利敝,这里只是扩展一种思路,对枚举值的存储方式的加以应用

     

    一.采用枚举值存储要准备什么呢?

           1.已知 单个枚举值清单

                 十进制带表枚举的值,每个值带表对应的工厂

               

           2.枚举的转换----枚举值的合并

                    假如我们前端UI吧,显示P1,P7两个工厂,对应的单个枚举值为1,32

                    而数据库存储的枚举值只有一个数值,怎么转换为一个值了

                    通过|或运算, 1 | 32 = 33  那么数据加存储的值应该是33,

                    这个33带表是P1与P7工厂

                   实现代码如下:   

            private  int  EnumMerger(params int[] enumVal)
            {
                if (enumVal.Length == 0)
                    return 0;
                int SumEnum = enumVal[0];
                if (enumVal.Length > 1)
                {
                    for (int i = 1; i < enumVal.Length ; i++)
                    {
                        SumEnum = SumEnum | enumVal[i];
                    }
                }
                return SumEnum;
            }

           3.枚举的转换----枚举值的分解

             数据库存储的枚举值是33,33分解后为1,32   分别对应P1,P7两个工厂

             如何将这个值分解转为对应的值呢

                实现代码:

     1         private  List<int> EnumSplit(int enumCount)
     2         {
     3             string bin2 = Convert.ToString(enumCount, 2);
     4             List<int> ListEnumVal = new List<int>(bin2.Length);
     5             for (int i = 0; i < bin2.Length; i++)
     6             {
     7                 if (bin2[i] == '1')
     8                 {
     9                     ListEnumVal.Add((int)Math.Pow(2, bin2.Length - i - 1));
    10                 }
    11             }
    12             return ListEnumVal;
    13         }

                   了解SQL SERVER 枚举值的分解,请点击

                    https://www.cnblogs.com/pcbren/p/9678329.html

    二.采用枚举值后,对SQL查询是否能满足要求了,这里对几种查询进行验证测试

        1.单个工厂值相等测试

            枚举值:32查找     代表:P7工厂

           实际值:P7查找    

           测试:结果一致

              

        2.like包含单个工厂值测试

            枚举值:32查找     代表:P7工厂

           实际值:P7查找    

            测试:结果一致

        3.like包含2个工厂值测试

            枚举值:33查找     代表:P1工厂与P7工厂

           实际值:P1,P7查找    

           测试:结果一致

        4.二个工厂值相等测试

            枚举值:33查找     代表:P1工厂与P7工厂

           实际值:P1,P7查找    

           测试:结果一致

    小结:

               1.测试结果:

                                    从这个测试结果看,通过枚举值应在在字段中效果也是不错的,和用like对比结果都是一致的.

                                    证明采用这样的枚举值存储多个值也是OK的。

               2.枚举位数量:

                                    采用位运算存储实际是将多种状态值映射为一个值,且数值是2的N次方关系,即1,2,4,8,16,32,64,128等等,

                                     如果存储上百种状态,值会溢出,所以当状态太多了不建议使用此种方式.

              3.枚举位查询性能:

                                    采用位运算性能是非常高的,二进制运算速率是远大于联表与字符串拼接,

                                   但采用位运算意味着逐行处理,因为查询时无法命中索引,当数据量大了后,后果是灾难性的。

                                    所以当表容量很大时,不建议采用位运算

              

               如果想了解位运算符请点击,说得很透了,一看就明白了。

               https://jingyan.baidu.com/article/1612d5008ff5b7e20f1eee4c.html

  • 相关阅读:
    go module配置
    beego conf配置文件
    go string类型的特性
    go语言简单介绍,增强了解
    beego项目和go项目 打包部署到linux
    第一个go程序
    linux下vim编辑器查找 关键字
    配置ngnix下的虚拟主机
    PHP中文无乱码截取
    #1040
  • 原文地址:https://www.cnblogs.com/pcbren/p/9678435.html
Copyright © 2011-2022 走看看