葡京签到送彩金数据库设计

前的言辞

  本文将详细介绍数据库设计之连带文化

 

需分析         

  1、用户当天登录商城,只要登录就直接奖励一定之积分或者因用户本周还是本月外一度连续签到的命进行积分奖励,后台可安装具体的赏规则,这里而本周外连签到三上奖励
1 积分,五天奖励 2 积分,七天奖励 3
积分,每周一签注到次数归零(归零方法不自然是每周一签到次数自动设为零星,详见下文)

  2、实现形式:在个人核心放置签到按钮或者登录成功后展开弹窗提示

  3、个人基本,用户可以望签到日志(如果安日志记录的讲话)和积分流水

  4、商城后台可本着签证到送积分的平整进行安装,也可望签到日子和积分流水,具体规则包括:1、奖励模式
2、相应模式配置 3、日志记录 4、是否打开等,具体详细签到配置表

签证到布置列表,这些安排信息可以格式化以后当商城的一律件配置

type

签到模式(当天签到就有奖励(1)、连续签到一定天数会有不同奖励(2))

configs

type为1时,表示每天签到奖励积分数;type为2时,表示连续签到天数以及奖励阶梯(可以作为数组元素并存)

open_log

是否记录签到日志

save_days

签到日志保存天数

is_open

是否开启签到机制

 

 

计划范式

  数据库设计共有三死范式:

  第一范式:无复的排

  第二范式:属性完全依赖让主键

  第三范式:属性不能够借助让主属性

  下面用分头对当下三独范式进行详尽介绍

 

数据库设计息息相关

  1、商城用户表添加下面两只字段

    last_signin_time
保存用户高达一样潮签注到时刻

    cont_days
保存用户连续签到数

  2、商城配置表添加一下字段

    signin_configs
保存商城签到成效配置信息(json格式化或者序列化都得以)

  3、签到日志表

表名:pre_signin_log

作用:用于保存用户登录日志记录

字段

数据类型

属性

自律规范

说明

id

int(10)

无符号、非空、自增

主键

主键id

user_id

int(10)

无符号、非空、默认0

外键、普通索引(signin_user_id)

用户id

integral_num

int(5)

无符号、非空、默认0

 

登录奖励积分

add_time

int(11)

无符号、非空、默认0

 

签证到时刻

第一范式

  数据库表中的各个一样排都是不可分割的骨干数据项,同一列被未可知出差不多单价值。具体而言,有以下简单漫漫要求

  1、每一样排列属性都是不足再劈的,确保各级一样列的原子性

  2、两排列的性能相近或一般或同,尽量合并属性一样的排,
确保不出冗余数据

  为考勤表设计啊例,考勤表用来记录每天生的考核情况

  最简便的情事是,每一样上还建立平等张表。字段是每个学生的全名,列值表示是否签到。这样,可以老有益之囤当天底考核情况。但是,这吗招致了每日还需在数据库里新建一张考勤表。而且,这种做法违背了第一范式,这张考勤表的字段的属性含义都是如出一辙的,都是记录学员的考核情况。因此,这些字段是要统一的

葡京签到送彩金 1

  更优化的设计是,第一字段是学员姓名,第二许段是0101象征`1月1日,第三字段是0102象征1月2日,以此类推。这种做法,不再用规划那么多表,将学生的姓名列合并成为了一个氏名列。但是,同样它没有依照第一范式,1年365龙, 代码除了学生姓名列外,还用设置365单字段。而且,这些列的义都是一模一样的,记录当天之考核。因此,这些字段也是需要联合之

葡京签到送彩金 2

  下面是优化的图景,把具备的日期合并成为一个日子字段,新增一个考核状态字段,如下所示,完全依照了第一范式,没有更的排列,且每一样排都是可拆分的。

葡京签到送彩金 3

  总而言之,用第一范式设计数据库时,就是讲数据,并以性相似之列合并

 

设计思路分析(用户登录操作时处理)

  1、当天签到就是送积分的概括模式(无需多言)

  2、根据用户连续签到数进行积分奖励的复杂性模式

    连续性判断:这个大概,判断昨天来无发生记名就实施

    连续签到次数判断:根据连续性判断结果,再判断当天凡免是周一,确定要重置本周即一连签到次数

    奖励积分数实现:确定了连续签到次数,就好因商城签到布置信息确定当天签证到后该奖励的积分数量并展开日志记录以及积分流水记录操作

仲范式

  第二范式需要依照以下要求:

  1、一个表表必须出一个主键

  2、没有包含在主键中之排必须完全依靠让主键,而无可知止
依赖让主键的相同有的

  因下面购物车表为例,用户ID和货ID构成了货的主键,数量排依赖让用户购买商品的数目,单价及商品名称只依靠让商品ID。因此,这张表不饱第二范式

葡京签到送彩金 4

  优化后,修改如下

葡京签到送彩金 5

 

php 示例代码(ecshop实现)

/**
* 代码中以文章开头的假设为思路,具体根据商城配置做修改
*/
function userSignin(){
    if (!$_SESSION['user_id'])
    {
        return false;
    }
    $time = getdate();
    $today_zero = mktime(0, 0, 0, $time['mon'], $time['mday'], $time['year']);
    $sql = "select last_signin_time from ".$GLOBALS['ecs']->table('users')." where user_id  = '$_SESSION[user_id]'";
    $last_signin_time = $GLOBALS['db']->getOne($sql);
    if($today_zero < $last_signin_time && $last_signin_time < ($today_zero + 24*60*60)){
       // 今日已经签到过了
    array('error'=>true, 'msg'=>'你今日已经签过到咯');
    }else{
        // 签到处理
        if($time['wday'] == 1){
            // 如果是周一,签到从零算起
            $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'";
            $GLOBALS['db']->query($sql);
       return array('error'=>false, 'msg'=>'签到成功');
        }else{
            // 如果不是周一得判断有没有连续签到,具体方法是判断昨天有没有签到,如果签到了,连续签到次数加一,如果没有签到,连续次数归一
            if(($today_zero - 24 * 60 *60) < $last_signin_time && $last_signin_time < $today_zero){
                // 昨天已经签过到,连续签到天数加一
                $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = cont_days + 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'";
                $GLOBALS['db']->query($sql);
                $cont_days = $GLOBALS['db']->getOne("select cont_days from ".$GLOBALS['ecs']->table('users')." where user_id  = '$_SESSION[user_id]'");
          // 根据文章开头的假设确定奖励积分数量
                switch ($cont_days) {
                    case 3:
                        $add_integrals = 1;
                        break;
                    case 5:
                        $add_integrals = 2;
                        break;
                    case 7:
                        $add_integrals = 3;
                        break;
                    default:
                        break;
                }
          // code...  // 签到日志记录操作和积分账户处理操作代码省略……
          if($add_integrals){
            return array('error'=>false, 'msg'=>'你已经连续签到 '.$cont_days.' 天,获得奖励 '.$add_integrals.' 积分');
          }else{
            return array('error'=>false, 'msg'=>'签到成功');
          }
            }else{
                // 昨天没有签到,连续签到天数归一
                $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'";
                $GLOBALS['db']->query($sql);
          return array('error'=>false, 'msg'=>'签到成功');
            }
        }
    }
}

$signinRes = userSignin();
var_dump($signinRes);  // 打印签到结果 

 

其三范式

  非主键列必须一直依赖让主键,不克是传递依赖。第三范式,相较于次范式而言,强调的凡一直依赖,而无可知是传递依赖

  关于传递依赖,以下面的中奖信息表为例,中奖金额依赖让中奖等级,而中将等和因让用户ID,这就是是传递依赖

葡京签到送彩金 6

  要论第三范式,就要排除传递依赖

葡京签到送彩金 7

  

快讯系统

  下面尝试下三个范式,来计划新闻系统数据库。包括以下要点:

  1、用户称、密码、是否是管理员

  2、新闻标题、新闻内容、作者、新闻日、是否上线

  3、评论人、评论内容、评论时、评论源

  分别针对利用户表、新闻表和评论表

  一般的话,用户称长度不超过20个字符,密码长度不超20单字符,新闻标题长度不跳30只字符,新闻内容长度不超过5000个字符,评论内容长度不越300只字符

  用户表详细如下

葡京签到送彩金 8

  新闻表详细如下

葡京签到送彩金 9

  评论表详细如下

葡京签到送彩金 10

 

最后

  于统筹数据库时,只待满足上述三单范式,就可以设计既合理而满足急需的数据库