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 == )
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 位运算应用实例的更多相关文章
- SQL Server COM 组件创建实例失败
SQL Server COM 组件创建实例失败 SQL2008数据库总会出现从 IClassFactory 为 CLSID 为 {17BCA6E8-A95D-497E-B2F9-AF6AA4759 ...
- sql server 链接到本地实例出错
我在使用VS2010测试package的时候,突然发现sql server 链接到本地实例出错,出错信息如下: “ A network-related or instance-specific err ...
- 此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭“的解决
此版本的 SQL Server 不支持用户实例登录标志.该连接将关闭“的解决(转) 2008-10-04 13:31 错误提示:说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息 ...
- Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)
Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...
- Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)
Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...
- Openfire 配置连接SQL SERVER(非默认实例)
安装好Openfire之后,紧接着进行配置. 连接数据库的时候遇上问题. 打算用我本机上的一个SQL SERVER做为数据库.但是,我本机装了几个SQL SERVER实例,现在我打算使用的是那个非默认 ...
- PCB SQL SERVER 正则应用实例
我们用过SQL SERVER的都知道,SQL SERVER它本身是不自带正则表达式的,因为没有,所以基本都没用过啊, 但我们在C#中对文本匹配用正则的方式处理非常好用,省得你写一堆代码实现匹配,多简洁 ...
- SQL server存储过程语法及实例(转)
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
- Java位运算经典实例
一 源码.反码.补码 正数的源码.反码.补码相同,例如5: 5的源码:101 5的反码:101 5的补码:101 负数的源码.反码.补 ...
随机推荐
- Luogu P4316 绿豆蛙的归宿
P4316 绿豆蛙的归宿 题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边 ...
- ZOJ - 3992 - One-Dimensional Maze (思维)
题意: 一条长度为n的直线,你一开始在位置m上 其中每个整点都有一个字符'L'或'R',如果是'L'那么你必须往左走一步,否则往右走一步 如果你到达位置1或位置n你任务就完成了 不过有可能你永远到不了 ...
- HDU - 2050 - 折线分割平面(数学 + dp)
题意: 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分 思路: 记住结论.. ...
- 基于python、jupyter-notebook 的金融领域用户交易行为分析
说明:本文重在说明交易数据统计.分析方法,所有数据均为生成的数据 时间原因代码未定义成函数 统计指标:1.用户单日交易行为数据 2.按小时为计算单位,统计用户行为数据(旨在求得一天24小时中每个小时的 ...
- 使用Mybatis的逆向工程自动生成代码
1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...
- nyoj 8 一种排序(用vector,sort,不用set)
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- h5dnd sortable mutil groups
h5dnd sortable mutil groups https://codepen.io/webgeeker/pen/JmPXaN https://codepen.io/webgeeker/pen ...
- 【BZOJ1014】火星人prefix(splay,Hash)
题意: . 思路: ; ..,..]of longint; sum,size,fa,a,b,id,mi:..]of longint; n,m,i,x,y,s,k,j,cnt,root:longint; ...
- - > 网络流(【最大流】草地排水模板题)
1993 草地排水 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在农夫约翰的农场上,每 ...
- iptables中增加/删除/查询/修改的基本操作
虽然在Ubuntu使用了UFW来简化iptables的操作,但是UFW只针对防火墙方面,转发方面没有涉及,所以要弄懂其中的原理,还是必须回归到iptables中.CentOS也是如此.下面是针对ipt ...