资讯专栏INFORMATION COLUMN

关于优惠券功能设计之我的见解

adie / 2665人阅读

摘要:假如我们的优惠券记录表的主键是由的方式增加。扩展在数据库中存储和读取二进制毕竟麻烦,根据以上思路,其实我们可以使用来解决,就是将优惠券领用的据通过中和来实现。

0x01

一些网站或APP在为了吸引用户,会在一些特定时间推出一些优惠券,然后用户通过认领这些优惠券从而在购买指定商品中获取到一些优惠。

0x02

根据此业务估计熟悉关系型数据库设计的人,脑海里立马就能想出下面3张表

用户表

优惠券表

用户优惠券认领表

假设所有的用户都认领了每次发放的优惠券那么:
用户优惠券认领表 = 用户记录 × 优惠券记录
如果用户数为:1000 ,优惠券为:100,那么用户优惠券认领表就是:100000
下面判断一个用户是否认领某张优惠券
select * from 用户优惠券认领表 where 用户id = "1" and 优惠券id = "2" and 是否认领 = "1"

如果您已经发现了问题,那么下面我就说另外一种设计思路

0x03

我们想想优惠券对于用户认领就两个状态:认领和没有认领,也就是0和1 。
你们估计已经想到我想说什么了。
假如使用一个bit代表一个用户是否认领的状态,那么8bit就能表示8个用户的状态,也就是说一个ascii码就能表示8个用户是否认领的状态.单单在磁盘空间上节省了不少。
那么试试多表查询判断用户是否认领的sql查询:
select 认领bit from 用户优惠券认领表 where 用户id = "1"
现在只需要解析这个认领bit即可.

0x04

那么下面我们来想想这个认领bit怎么设计比较合适
先得知道我们优惠券发放的频率,假如每天发放一个优惠券发放5年:
365 * 1 * 5 = 1825(bit)
也就是1825 / 8 = 228(byte)的长度.

0x05

存储结构弄好了,那么怎么样才能把数据放进去再读出来呢?
上面我们说设计的是1825张优惠券。
那么对于优惠券表就只有1825条记录。
这1825也就对应用户优惠券认领表的1825bit 。
假如我们的优惠券记录表的主键是由1 2 3 4 5 6...1825的方式增加。
那么就有:

     1 % 1825 = 1 
     2 % 1825 = 2
     3 % 1825 = 3
     4 % 1825 = 4
     5 % 1825 = 5
     .
     .
     .
     1824 % 1825 = 1824
     1825 % 1825 = 0

想必大家都看明白了,也就通过取模的方式定位到一个bit的偏移量
基本上这就是在关系型数据库中设计的思路。

0x06

扩展:在数据库中存储和读取二进制毕竟麻烦,根据以上思路,其实我们可以使用redis来解决,就是将优惠券领用的bit据通过redis中setbit和getbit来实现。如果有需要还可以给他一个自动过期时间,是不是更方便?聪明的读者可能已经想到如何解决现实中问题了。

2015-12-27 15:23
by Sean
首发简书

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46589.html

相关文章

  • 关于惠券功能设计我的见解

    摘要:假如我们的优惠券记录表的主键是由的方式增加。扩展在数据库中存储和读取二进制毕竟麻烦,根据以上思路,其实我们可以使用来解决,就是将优惠券领用的据通过中和来实现。 0x01 一些网站或APP在为了吸引用户,会在一些特定时间推出一些优惠券,然后用户通过认领这些优惠券从而在购买指定商品中获取到一些优惠。 0x02 根据此业务估计熟悉关系型数据库设计的人,脑海里立马就能想出下面3张表 用户表 ...

    newsning 评论0 收藏0
  • MongoDB之我是怎么成为Primary节点的

    摘要:此文已由作者温正湖授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。而严格的不会出现这个情况。最后安利下,网易蜂巢云服务已经重磅上线,蜂巢由业界著名的数据库专家姜承尧亲自把关架构设计,免费提供售前技术支持。 此文已由作者温正湖授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 Primary(主)是MongoDB复制集中的最重要的角色,是能够接...

    microcosm1994 评论0 收藏0
  • Spring框架之我见(三)——IOC、AOP

    摘要:模块负责的所有面向切面的功能。总结的统一管理,降低了对象之间的耦合对主流的框架提供了很好的集成支持提供众多组件,事务管理,等具有高度可开放性,开发者可以自由选择部分或全部主要使用工厂模式和代理模式。 聊完了Spring框架中最重要的两种设计模式,我们来看一下Spring框架的模块和结构图。 Spring框架的结构 下图是Spring官方给出的Spring框架的结构图。 showImg(...

    khs1994 评论0 收藏0
  • Spring框架之我见(一)——工厂模式

    摘要:相对于工厂模式,抽象工厂模式生产的对象更加具体,也更加丰富,但相对编码也更加复杂。具体的抽象工厂模式的实现大家可以参考菜鸟教程。知道了工厂模式和抽象工厂模式的区别,请大家使用的时候应该根据具体的情况进行选择。 大家好,今天给大家分享一些Spring的学习心得,在讲Spring之前,先和大家分享Spring中核心的设计模式。 工厂模式 在聊概念之前我先问问大家:什么是工厂? 这个很简单,...

    venmos 评论0 收藏0
  • [转]MD5(2)-破解MD5之我

    摘要:认为要从的结果中取得原文才算破解,本身就是对摘要算法的误解。摘要算法与上面两种完全不同,前面两种密码是用于防止信息被窃取,而摘要算法的目标是用于证明原文的完整性,也就是说用于防止信息被篡改。当进行摘要算法后,信息就丢失了。 转载请注明出处 http://www.paraller.com 原文排版地址 http://www.paraller.com/2016/05/22/%5B%E8...

    张红新 评论0 收藏0

发表评论

0条评论

adie

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<