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


    程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?
    一般有几种方法
    (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)增加了理解复杂度;
     
    以下是四个状态情况的二进制与十进制存储对照表:
     
  • 相关阅读:
    支付宝开发平台之第三方授权登录与获取用户信息
    Struts2之访问路径
    Struts2之命名空间与Action的三种创建方式
    vs和vim
    linux下的各个目录(待填)
    linux-CentOS初学terminal命令(3)rm、chmod、mkdir、who、w、id、systemctl、
    gcc和vs在c的一些区别
    利用putty在window下控制linux的terminal、ftp传输
    linux-CentOS初学terminal命令(2)vi、gcc、g++、./、mv、cp、ifconfig
    linux初学terminal命令(1)ls、cd、su、man、pwd、useradd、passwd、cat、Ctrl+C、Ctrl+Z、Ctrl+L
  • 原文地址:https://www.cnblogs.com/Thenext/p/9709497.html
Copyright © 2020-2023  润新知