数据库状态标识位flag设计
设计目的
- 减少各种状态值字段
- 减少数据库冗余和存储空间
- 增加状态值时可灵活调整,无需增加额外字段
运用场景
例子1:管理用户的支付方式
比如针对不同用户组设置了不同的支付方式支持,假设支付方式有支付宝
、微信
、银联
、借条
等。A用户支持支付宝、微信;B用户支持支付宝、微信、借条。一般用户支付方式数据库设计为:
ID | name | alipay | weixin | union | iou |
---|---|---|---|---|---|
1 | A | 1 | 1 | 0 | 0 |
2 | B | 1 | 1 | 0 | 1 |
这时如果后续多了其它支付方式后,就需要调整表结构增加字段,如快钱、货到付款等。这种设计方式明显不符合数据库设计第一范式,增加了很多冗余字段和存储空间。
例子2:设置用户的操作权限
比如有一组权限列表,查看
,编辑
,发布
,删除
,数据库可能会是这样:
ID | name | is_visible | is_editble | is_publishable | is_deleteable |
---|---|---|---|---|---|
1 | A | 1 | 1 | 0 | 0 |
2 | B | 1 | 1 | 1 | 1 |
上面只是举些例子来说明一个问题,当一张表的字段里包含很多这些状态值01时,我们可以使用二进制位
的方式来表示,而且只需要一个字段就好了。
设计思路
比如例1中的支付方式,假设我们最多可设计有10种支付方式。
字段仍设为int整形,A支持支付宝、微信,则值为12(1100);B支持支付宝、微信、借条,则值为13(1101),表结构如下:
ID | name | pay_flag |
---|---|---|
1 | A | 12 |
2 | B | 13 |
如果增加了货到付款,可再赋值给二进制的第五位,其它位还是保持不变。
这时候会涉及到数据库查询问题,比如上面的值12、13都支持支付宝、微信,还有14(1110)、15(1111)也支持,如果增加了二进制第五位,那么会有更多匹配值,如30(11110)、28(11100)等...
如果要查询支持支付宝、微信的数据怎么办?这时只需要通过“位”的与运算,就能简单的查询出想要数据:
select * from user_pay where pay_flag & b'1100';
# 或者:
select * from user_pay where pay_flag & 12;
php简单实现
class PayFlag {
const ALIPAY = 8; //01000
const WEIXIN = 4; //00100
const UNION = 2; //00010
const IOU = 1; //00001
function addFlag($old_flag, $flag) {
return $old_flag | $flag;
}
function delFlag($old_flag, $flag) {
return $old_flag ^ $flag;
}
}
$old_flag = 6; //00110
$PayFlag = new PayFlag;
//原有值 - 输出 6:110
echo($old_flag . ":" . decbin($old_flag) . PHP_EOL);
//增加ALIPAY - 输出 14:1110
$new_flag = $PayFlag->addFlag($old_flag, PayFlag::ALIPAY);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);
//移除ALIPAY - 输出 6:110
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::ALIPAY);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);
//移除UNION - 输出 4:100
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::UNION);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);
//增加IOU - 输出 5:101
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::IOU);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);
数据库状态标识位flag设计的更多相关文章
- Java秒杀简单设计二:数据库表和Dao层设计
Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表 https://www.cnblogs.com/taiguyiba/p/9791431.html ...
- verilog实现的16位CPU设计
verilog实现的16位CPU设计 整体电路图 CPU状态图 idle代表没有工作,exec代表在工作 实验设计思路 五级流水线,增加硬件消耗换取时间的做法. 具体每一部分写什么将由代码部分指明. ...
- SQL切换真假状态标识字段
需求:用一条SQL(SQL SERVER)语句,实现反向更改状态标识字段(类型为bit)的值.即是从true变false,或从false到true. 方案: 一.判断原来这个字段值,然后UPDATE为 ...
- 4. SQL Server数据库状态监控 - 作业状态
原文:4. SQL Server数据库状态监控 - 作业状态 有很多地方可以设置定时任务,比如:Windows的计划任务,Linux下的crontab,各种开发工具里的timer组件.SQL Serv ...
- 执行时关闭标识位 FD_CLOEXEC 的作用
首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...
- SQL SERVER数据库状态(脱机,联机,可疑)及SQL设置语句详解
首先我们应该知道数据库总是处于一个特定的状态中,下面先来了解一下数据库的常见的三种状态:1,脱机:我们可以在Microsoft SQL Server Management中看到该数据库,但该数据库 ...
- 2. SQL Server数据库状态监控 - 错误日志
原文:2. SQL Server数据库状态监控 - 错误日志 无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯 ...
- 3. SQL Server数据库状态监控 - 可用空间
原文:3. SQL Server数据库状态监控 - 可用空间 数据库用来存放数据,那么肯定需要存储空间,所以对磁盘空间的监视自然就很有必要了. 一. 磁盘可用空间 1. 操作系统命令或脚本.接口或工具 ...
- SQLSERVER 运维日记-数据库状态
背景 新年伊始,小伙伴是不是还处于假期综合症的状态.我们在日常运维数据库的时候,会时常查看数据库的状态,检查数据库是否正常运行.对于这些状态的熟悉对于我们处理数据库无法访问的 问题非常重要.当数据库突 ...
随机推荐
- s11 day103 luffy项目结算部分+认证+django-redis
1.增加认证用的表 class Account(models.Model): username =models.CharField(,unique=True) email= models.EmailF ...
- Sentinel 哨兵 实现redis高可用
本文链接:http://www.cnblogs.com/zhenghongxin/p/8885879.html 我们知道redis是有主从复制的,例如下图: 但如果master主进程挂掉之后,没有sl ...
- HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...
- 比特、字节、K
比特(bit) 比特,计算机专业术语,是信息量单位,由英文BIT音译而来.BIT为Binary digit(二进制数)位的缩写.二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特. 字 ...
- 解决onclick事件的300ms延时问题
首先是资源的下载:fastclick.js 作为一个新手,插件原理什么的研究不透,看的也是似懂非懂的,网上有很多大牛写的博文相当的好,对于写文章方面确实是望尘莫及啊,所以想详细了解原理的朋友直接去大牛 ...
- Storm实现单词统计代码
import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashM ...
- 二、源代码=>程序集及程序集概念介绍
文本脉络图如下: 一.源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将托管模块合并成程序集. 1.程序集的 ...
- Linq基础知识之延迟执行
Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行,也就是在enumerator的MoveNext()方法被调用的时候执行,大说数Linq查询操作实 ...
- phpdocumentor生成代码注释文档(linux)
1,默认安装lnmp环境(php7),默认pear安装 2, pear channel-discover pear.phpdoc.org pear install phpdoc/phpDocume ...
- 【转】asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别
原文地址:http://blog.csdn.net/luoyeyu1989/article/details/8275866 首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BL ...