数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题
2016-11-14 17:57
567 查看
程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?
一般有几种方法
(1)建立关联表
关联表字段:关系Id,商品Id,属性Id
查询:使用关联表的方式,查询某属性的商品。
程序:写入时,写商品表和关联表;
(2)将多个属性存在一个字段中,用|分割
状态存储在一个字段中,比如某条商品属于热卖,新品和特卖,则字段存储的值:01|02|03
SQL查询:使用like
程序处理:(1)取值需要先将01,02,03分割,再处理。(2)写入需要先将01,02,03组合为一个字符串再存储。
以上两种方法可以可以解决多个状态关联的问题,但是存在以下问题
(1)增加了表和程序复杂度;
(2)需要改代码,不利于扩展;
有没有更好的方法,处理一条记录多个状态的问题呢?
使用二进制位,每个位置,代表一个状态,多个位置代表多个状态,存储的时候转换为int类型存储。
以产品属性存储为例。
热门:0000 0001
新品:0000 0010
特卖:0000 0100
多个状态的组合
热门+新品:0000 0011
热门+特卖:0000 0101
热门+新品+特卖:0000 0111
存储时将二进制转换为int数值。
二进制位的查询
以Oracle为例,使用bitadd函数,如:
[align=left]SELECT * FROM T_PRODUCT WHERE bitand(property,1)=1[/align]
java中对二进制位的处理
1)是否包含:&与运算符,比如:(1&3)==1
2)组装:|或运算符,比如 1|2=3
如果再扩展,清仓状态,可以使用 0000 1000
二进制实现的好处
以上内容讲解了使用二进制位来表示状态的方式,实现数据库设计和程序调用。有以下好处
1)存储精简
2)扩展性强
缺点:
1)增加了理解复杂度;
以下是四个状态情况的二进制与十进制存储对照表:
一般有几种方法
(1)建立关联表
关联表字段:关系Id,商品Id,属性Id
查询:使用关联表的方式,查询某属性的商品。
程序:写入时,写商品表和关联表;
(2)将多个属性存在一个字段中,用|分割
状态存储在一个字段中,比如某条商品属于热卖,新品和特卖,则字段存储的值:01|02|03
SQL查询:使用like
程序处理:(1)取值需要先将01,02,03分割,再处理。(2)写入需要先将01,02,03组合为一个字符串再存储。
以上两种方法可以可以解决多个状态关联的问题,但是存在以下问题
(1)增加了表和程序复杂度;
(2)需要改代码,不利于扩展;
有没有更好的方法,处理一条记录多个状态的问题呢?
使用二进制位,每个位置,代表一个状态,多个位置代表多个状态,存储的时候转换为int类型存储。
以产品属性存储为例。
热门:0000 0001
新品:0000 0010
特卖:0000 0100
多个状态的组合
热门+新品:0000 0011
热门+特卖:0000 0101
热门+新品+特卖:0000 0111
存储时将二进制转换为int数值。
二进制位的查询
以Oracle为例,使用bitadd函数,如:
[align=left]SELECT * FROM T_PRODUCT WHERE bitand(property,1)=1[/align]
java中对二进制位的处理
1)是否包含:&与运算符,比如:(1&3)==1
2)组装:|或运算符,比如 1|2=3
如果再扩展,清仓状态,可以使用 0000 1000
二进制实现的好处
以上内容讲解了使用二进制位来表示状态的方式,实现数据库设计和程序调用。有以下好处
1)存储精简
2)扩展性强
缺点:
1)增加了理解复杂度;
以下是四个状态情况的二进制与十进制存储对照表:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/28/2b7186a93c7b709f4fc880883e9c3a59.png)
相关文章推荐
- 数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题
- 解决EasyUi中的DataGrid删除一条记录后,被删除的数据仍处于被选中状态问题
- 设计数据库字段经常会使用1,2,3来代表数据记录的状态
- DB2 insert or update 解决方案(使用merge into 解决一条记录,或者多表关系问题)
- 解决EasyUi中的DataGrid删除一条记录后,被删除的数据仍处于被选中状态问题
- 设计能够导出所有记录到excel的分页(使用AspNetPager)页面,并解决excel文件名中文乱码问题
- 数据库使用中一些问题解决记录
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- 使用视图解决在报表中的多表关联问题(转)
- [网络问题,截图以后再传]本实验是设计性实验。目的在于使用关系数据库标准语言SQL,掌握视图和索引的操作。
- 关于使用CreateUserWinzard控件创建用户时出现连接数据库问题的解决方法
- vs2005中 该项不适于在指定状态下使用 问题的解决
- 每次重启Tomcat后,使用Hibernate修改数据库的记录都会导致以前记录被删除的解决办法。
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- 设计模式学习1—使用单件模式解决对象重复申请问题
- 使用CsV格式的CDR记录碰到的一个怪问题的解决
- 一条SQL语句,关于字符分割关联多条记录的问题
- 使用搜索引擎来解决数据库的问题?
- 解决问题记录(1)-使用OleDbProvider连接Oracle出错
- 在使用SSIS设计脚本时候,出现的在PostExecute之外不能锁定变量集合进行读写访问的问题的解决