什么是固定商品?
假设我们只卖鞋的,那么整个商品的属性基本都是一致的。譬如鞋的颜色、尺寸、款式、品牌、价格。
这时我们涉及到的表往往是“平面的”,譬如: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;