zoukankan      html  css  js  c++  java
  • 数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题

    程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?
    一般有几种方法
    (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)增加了理解复杂度;
     
    以下是四个状态情况的二进制与十进制存储对照表:
     
  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/Thenext/p/12200861.html
Copyright © 2011-2022 走看看