什么是固定商品?

假设我们只卖鞋的,那么整个商品的属性基本都是一致的。譬如鞋的颜色、尺寸、款式、品牌、价格。

这时我们涉及到的表往往是“平面的”,譬如:id、商品名称、商品属性1、商品属性2、商品属性3...
最后再来个商品分类表就基本完事了。


设计商品主表(假设我们是B2C网站)

一、即时更新

id、商品名称、所属分类、入库时间、商品简介。

二、延时更新

总点击量、月点击量、总销售量、月销售量、总评价数、月评价数。


需求

作为一个电商系统。我们除了知道商品的总点击量。
还需要知道商品的周点击和月点击。

然而这些数据是不能记录在商品主表中的。

同时还需要有个日志表,记录商品的点击和用户的爱好


新建商品主表prod_main:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `prod_main`
-- ----------------------------
DROP TABLE IF EXISTS `prod_main`;
CREATE TABLE `prod_main` (
  `prod_id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_name` varchar(50) NOT NULL,
  `prod_classid` int(11) NOT NULL,
  `prod_intr` text NOT NULL,
  `prod_adddate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `prod_click_all` int(11) NOT NULL DEFAULT '0',
  `prod_click_month` int(11) NOT NULL DEFAULT '0',
  `prod_sale_all` int(11) NOT NULL DEFAULT '0',
  `prod_sale_month` int(11) NOT NULL DEFAULT '0',
  `prod_rate_all` int(11) NOT NULL DEFAULT '0',
  `prod_rate_month` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`prod_id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of prod_main
-- ----------------------------
INSERT INTO `prod_main` (prod_name, prod_classid) VALUES ('python黑帽子', '1');
INSERT INTO `prod_main` (prod_name, prod_classid) VALUES ('mysql从入门到跑路', '1');

新建商品分类表prod_class:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `prod_class`
-- ----------------------------
DROP TABLE IF EXISTS `prod_class`;
CREATE TABLE `prod_class` (
  `prod_classid` int(11) NOT NULL AUTO_INCREMENT,
  `prod_classname` varchar(50) NOT NULL,
  `prod_pclassid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`prod_classid`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of prod_class
-- ----------------------------

新建商品日志表 prod_log:

注意,这里的 clickdate 是设计为 date 类型,我们只需要精确到年月日即可。

这样做的目的是方便统计日销量。如果是同一日。那就累加clicknum即可。大幅度减少表的体积。

-- ----------------------------
-- Table structure for `prod_log`
-- ----------------------------
DROP TABLE IF EXISTS `prod_log`;
CREATE TABLE `prod_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_ip` varchar(15) NOT NULL,
  `user_id` int(11) NOT NULL DEFAULT '0',
  `prod_id` int(11) NOT NULL,
  `clickdate` date NOT NULL,
  `clicknum` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of prod_log
-- ----------------------------

使用存储过程模拟读取商品页面

1、从商品主表根据ID读取所有商品信息;

2、如果读取到,则记录点击量日志。

3、如果今天已经有数据了,那么点击量+1,如果没有则插入。

新建存储过程:sp__prod__log:

BEGIN
    SET @num = 0;
    SET @count = 0;
    SELECT * FROM prod_main WHERE prod_id = _prod_id LIMIT 1;
    SET @num = FOUND_ROWS();

    # 代表商品取出成功
    IF @num = 1 THEN
        # 查询今天是否已有点击,如果有那么点击量+1,如果没有则插入。
        SELECT count(*) INTO @count FROM prod_log WHERE prod_id = _prod_id AND user_ip = _user_ip AND user_id = _user_id AND clickdate = CURRENT_DATE;
        IF @count > 0 THEN
            UPDATE prod_log SET clicknum = clicknum + 1 WHERE prod_id = _prod_id AND user_ip = _user_ip AND user_id = _user_id AND clickdate = CURRENT_DATE;
        ELSE
            INSERT INTO prod_log(prod_id, user_ip, user_id, clickdate) VALUES (_prod_id, _user_ip, _user_id, CURRENT_DATE);
        END IF;
    END IF;
END

调用存储过程示例:

call sp_prod_log(1, '192.168.1.1', 56);

call sp_prod_log(2, '192.168.1.1', 31);

如果我们要查询和分析商品的点击情况,可以使用以下语句:

SELECT prod_id, sum(clicknum) AS 总点击量 FROM prod_log GROUP BY prod_id;

results matching ""

    No results matching ""