在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 == )
return ;
int SumEnum = enumVal[];
if (enumVal.Length > )
{
for (int i = ; i < enumVal.Length ; i++)
{
SumEnum = SumEnum | enumVal[i];
}
}
return SumEnum;
}

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

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

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

实现代码:

         private  List<int> EnumSplit(int enumCount)
{
string bin2 = Convert.ToString(enumCount, );
List<int> ListEnumVal = new List<int>(bin2.Length);
for (int i = ; i < bin2.Length; i++)
{
if (bin2[i] == '')
{
ListEnumVal.Add((int)Math.Pow(, bin2.Length - i - ));
}
}
return ListEnumVal;
}

了解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

PCB SQL SERVER 位运算应用实例的更多相关文章

  1. SQL Server COM 组件创建实例失败

    SQL Server COM 组件创建实例失败   SQL2008数据库总会出现从 IClassFactory 为 CLSID 为 {17BCA6E8-A95D-497E-B2F9-AF6AA4759 ...

  2. sql server 链接到本地实例出错

    我在使用VS2010测试package的时候,突然发现sql server 链接到本地实例出错,出错信息如下: “ A network-related or instance-specific err ...

  3. 此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭“的解决

    此版本的 SQL Server 不支持用户实例登录标志.该连接将关闭“的解决(转) 2008-10-04 13:31 错误提示:说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息 ...

  4. Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)

    Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...

  5. Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)

    Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...

  6. Openfire 配置连接SQL SERVER(非默认实例)

    安装好Openfire之后,紧接着进行配置. 连接数据库的时候遇上问题. 打算用我本机上的一个SQL SERVER做为数据库.但是,我本机装了几个SQL SERVER实例,现在我打算使用的是那个非默认 ...

  7. PCB SQL SERVER 正则应用实例

    我们用过SQL SERVER的都知道,SQL SERVER它本身是不自带正则表达式的,因为没有,所以基本都没用过啊, 但我们在C#中对文本匹配用正则的方式处理非常好用,省得你写一堆代码实现匹配,多简洁 ...

  8. SQL server存储过程语法及实例(转)

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  9. Java位运算经典实例

    一 源码.反码.补码 正数的源码.反码.补码相同,例如5:            5的源码:101            5的反码:101            5的补码:101 负数的源码.反码.补 ...

随机推荐

  1. TWaver3D特效之高光反射

    前篇我们介绍了TWaver 3D的环境映射特效,下面我们接着给大家分享高光反射特效.高光反射定义了物体上的某一区域比其他地方更反光.在高光反射的贴图中,黑色区域的反射率为0(完全不反光),白色区域的反 ...

  2. ionic3视频播放功能

    因为项目的需要,需要使用视频播放的功能,使用的是videogular2插件,但是报了一个无法识别video-player 这个标签,百度了很多,发现原来是版本 不对,ionic3是以来angular5 ...

  3. C语言scanf函数详细解释(转载)

    原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...

  4. 树状数组 & lowbit()

    看了很多大佬的博客,每看一篇博客懂一部分,总算是大概理解了树状数组这个神奇又强大的东西: 在这里我做个整合,把我认为好的部分摘录下来: 参考博客1:https://blog.csdn.net/flus ...

  5. 关于dijkstra的小根堆优化

    YY引言 在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路.而SPFA的最坏复杂度能够被卡到$O(VE)$.就是边的数量乘以点的数 ...

  6. Linux下挂载新磁盘

    Linux的硬盘识别: 一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘 设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.   1.关闭服务器加上新硬盘   2.启动服务器,以r ...

  7. 用Python实现阿里钉钉机器人读取数据库内容自动发群通知

    最近想把一些预警数据信息按照一定的要求自动发送到移动端APP,最终把目标放在了腾讯的微信和阿里的钉钉软件上,由于刚开始学习python,于是编程工具想用python来实现.微信使用群体最广,通过一天的 ...

  8. x component of 2nd stokes wave--- C code

    * Source code The following is a C code for x component of 2nd stokes wave ××××××××××××××××××××× /*s ...

  9. 洛谷 1541 NOIp2010提高组 乌龟棋

    [题解] 很容易想到这是一个DP,f[i][j][k][l]表示4种卡片分别用了多少张,那么转移方程就是f[i][j][k][l]=Max(f[i-1][j][k][l],f[i][j-1][k][l ...

  10. 【Codeforces 1073D】Berland Fair

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们可以从左到右枚举一轮. 定义一个cost表示这一轮花费的钱数 如果cost+a[i]<=T那么就可以买它,并且买下它(模拟题目要求) ...