数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题

程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?
一般有几种方法
(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函数,如:
SELECT * FROM T_PRODUCT WHERE bitand(property,1)=1
 
java中对二进制位的处理
1)是否包含:&与运算符,比如:(1&3)==1
2)组装:|或运算符,比如 1|2=3
 
如果再扩展,清仓状态,可以使用 0000 1000
 
二进制实现的好处
以上内容讲解了使用二进制位来表示状态的方式,实现数据库设计和程序调用。有以下好处
1)存储精简
2)扩展性强
 
缺点:
1)增加了理解复杂度;
 
以下是四个状态情况的二进制与十进制存储对照表:
 
posted @   Thenext  阅读(325)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示