在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

最新文章

  1. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)
  2. java split进行字符串分割
  3. Redis与Memcached的区别
  4. WP7/WP8/WP8.1设置存储的区别
  5. 个人开发者做一款Android App需要知道的事情
  6. Android文件Apk下载变ZIP压缩包
  7. 微软Azure已开始支持hadoop--大数据云计算
  8. int&amp; a = b 的思考
  9. 从IT的角度思考BIM(二):模式与框架
  10. NodeJS 中npm包管理工具
  11. 2,返回Json
  12. python3 进一步了解装饰器 NLP第四条
  13. Spring Cloud项目之断路器集群监控Hystrix Dashboard
  14. 关于12c安装后打补丁
  15. sqlserver中的数据转换与子查询
  16. 关于C++中的指针、数组
  17. OSINT系列:威胁信息挖掘ThreatMiner
  18. express-session 产生的警告问题
  19. ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)
  20. [LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一个丢失的正数)

热门文章

  1. Extjs选中多行Grid提交
  2. ExtJs如何判断form表单是否被修改过详解
  3. python 爬取微信好友列表和个性签名,绘制个性签名云图
  4. Python学习-算术运算符,赋值运算符和复合运算符
  5. Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)
  6. Python学习第二阶段day1 内置函数,序列化,软件目录开发规范
  7. hdu2852 KiKi&#39;s K-Number
  8. [codevs 1482]路线统计(矩阵乘法)
  9. [bzoj 1047][HAOI2007]理想正方形(单调队列)
  10. ubuntu18.04安装magento2