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

程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?

一般有几种方法

(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)增加了理解复杂度;

以下是四个状态情况的二进制与十进制存储对照表:

参考:

http://www.cnblogs.com/itfly8/p/6062757.html

时间: 2024-11-03 21:53:43

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

《.NET 设计规范》第 6 章:扩展性设计

第 6 章:扩展性设计 6.1 扩展机制 考虑用不包含任何虚成员或受保护的成员的非密封类来为框架提供扩展性.这种方法所提供的扩展性广受用户欢迎,而且它的开销也不高. 考虑将受保护的成员用于高级的定制方案. 要在对安全性.文档及兼容性进行分析时,把非密封类中受保护的成员当做公有成员那样来对待. 考虑使用回调函数来允许用户向框架提供自定义的代码供框架执行. 考虑使用事件来允许用户对框架的行为进行定制,这样就不需要用户对面向对象设计有深入的了解. 要优先使用事件,而不是简单的回调函数,其原因在于广大开

浅谈如何做业务项目通用性、扩展性设计

前言 总结下如何设计项目方案.本文从通用.扩展两个角度去考虑项目该怎么设计,有哪些常用的手段.水平有限,望大家留言指正. 必要前提 充分的业务分析 充分了解业务细节:需求分析或者prd阶段,要充分掌握需求的细节.细节可能会决定:数据从哪获取(多处数据源如何统一接入),如何流转(流程插拔),存储选型(那种存储方便扩展:比如nosql存储异构数据). 考虑不同业务线的差异:业务线的差异可能会导致:数据源不同.指标口径不同.规则差异. 未来3-5年的规划 给未来留扩展空间:这个主要考虑业务的发展趋势,

实践 | Sentinel 扩展性设计

摘要: Sentinel 提供多样的 SPI 接口用于提供扩展的能力.用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑. 初始化逻辑扩展机制 为了统一初始化的流程,我们抽象出了 InitFunc 接口代表 Sentinel 的一些初始化逻辑,如: 注册动态规则源(示例) 注册 StatisticSlot 回调函数(示例) 启动 Command Center 初始化心跳发送 我们可以通过注解设置 InitFunc 执行的

深入NGINX:我们如何设计它的性能和扩展性

英文原文:Inside NGINX: How We Designed for Performance & Scale 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的(process-based)架构, NGINX则以一种复杂的事件驱动(event-driven)的架构脱颖而出,这种架构能支持现代硬件上成千上万的并发连接. Inside NGINX info

服务的扩展性(如何创建具有可扩展性的服务实例,缓存以及数据库)

转自:http://www.cnblogs.com/loveis715/p/5097475.html 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻

在设计IOSapp时为了代码的扩展性可可维护性需要遵守的原则

作为软件工程范畴的iosApp,为了保持代码的可维护性和扩展性,必然要遵守软件的基本特性,众所周知高内聚低耦合的程序才能具备这样的特性. 首先,不能依赖于storyboard和xib,原显而易见.第一点是,在源代码管理方面,在团队项目中,一旦有人改变了一点内容storyboard就会显示modify的样子,所以让人看起来很不安,其实带着M的原因很可能就是其他团队成员鼠标手点击了一下而已,最新的源代码管理工具在Xcode中的集成基本上解决了这个问题,但是依然还是会产生严重的代码冲突,这不是团队人员

golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: unsupported Scan, storing driver.Value type <nil> 解决方案就是动态的把数据 字段前加一上一个COALESCE SELECT u.id,ta.`title` as `活动名` ,COALESCE(IFNULL(i.name,i.nickname) F

nginx、keepalived、lvs、f5可以很好的解决高可用、扩展性、反向代理+扩展均衡的问题

1.单机 1)浏览器通过DNS-server,域名解析到ip 2)浏览器通过ip访问web-server 缺点: 1)非高可用,web-server挂了整个系统就挂了 2)扩展性差,当吞吐量达到web-server上限时,无法扩容 2.DNS轮询 DNS轮询:通过在DNS-server上对一个域名设置多个ip解析,来扩充web-server性能及实施负载均衡的技术 1)多部署几份web-server,1个tomcat抗1000,部署3个tomcat就能抗3000 2)在DNS-server层面,

Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 5. 组合(Composition),而不是继承(inheritance) 2 6. Ocp原则开闭原则2 7. Plugin系统2 8. 流程扩展工作流系统,流程自定义2 9. Ui扩展 html53 10. 数据独立性3 11. 脚本与hotdeploy3 12. 表处理扩展if else (数据与数据处理相互分离)3 13. 系统被扩展的几种形式(方法级别,模块级别)3 1