文章内容

2018/3/5 10:53:08,作 者: 黄兵

两种商品数据库的MySQL代码

最近在研究商品数据库,世界上的商品千千万万,每种商品又有自己的属性,例如:冲锋衣有不同品牌,同一品牌又有不同种颜色,同一颜色又有不同大小。

感觉这些无穷无尽,所以必须要一个健壮的数据库来承载这些数据。

最近几天研究了一下商品数据库的设计,收益良多,将最近收集的MySQL建库SQL代码记录下来,不断学习,不断进步。

第一种:

DROP TABLE IF EXISTS `category`; -- 类目表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `parent_flag` tinyint(1) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `use_flag` tinyint(1) DEFAULT NULL,
  `code` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `category_property`; -- 类目属性关联表(公共属性,叶子类目的特有属性,设计成父子关系,不好理解,但却可以减少表的很多数据量)
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `category_property` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) DEFAULT NULL,
  `property_id` int(11) DEFAULT NULL,
  `parent_flag` tinyint(1) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `cat_prop_val`; -- 类目属性值表(关系表,可以精准控制每个类目的属性值)
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `cat_prop_val` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_prop_id` int(11) DEFAULT NULL,
  `value_id` int(11) DEFAULT NULL,
  `status` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `goods`; -- 简单的商品表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `category_id` int(11) DEFAULT NULL,
  `store_id` int(11) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `use_flag` tinyint(1) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `up_time` datetime DEFAULT NULL,
  `down_time` datetime DEFAULT NULL,
  `description` varchar(45) DEFAULT NULL,
  `keywords` varchar(45) DEFAULT NULL,
  `min_price` varchar(45) DEFAULT NULL,
  `max_price` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `goods_property`; -- 商品非销售属性表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `goods_property` (
  `id` int(11) NOT NULL,
  `goods_id` int(11) DEFAULT NULL,
  `property_id` int(11) DEFAULT NULL,
  `property_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `goods_prop_value`;-- 商品非销售属性的值表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `goods_prop_value` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_prop_id` int(11) DEFAULT NULL,
  `value_id` int(11) DEFAULT NULL,
  `value_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `goods_sku`; -- 商品sku表(同商品属性表,分开设计是可以提高查询速度)
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `goods_sku` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_id` int(11) DEFAULT NULL,
  `property_id` int(11) DEFAULT NULL,
  `property_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `goods_sku_value`; -- 商品sku 值表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `goods_sku_value` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_sku_id` int(11) DEFAULT NULL,
  `value_id` int(11) DEFAULT NULL,
  `value_name` varchar(64) DEFAULT NULL,
  `image_uri` varchar(128) DEFAULT NULL,
  `quality` int(11) DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `property`; -- 类目属性表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `property` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `is_key` tinyint(1) DEFAULT NULL,
  `is_multi` tinyint(1) DEFAULT NULL,
  `is_color` tinyint(1) DEFAULT NULL,
  `is_enum` tinyint(1) DEFAULT NULL,
  `is_required` tinyint(1) DEFAULT NULL,
  `is_alias` tinyint(1) DEFAULT NULL,
  `is_sell` tinyint(1) DEFAULT NULL,
  `is_input` tinyint(1) DEFAULT NULL,
  `is_search` tinyint(1) DEFAULT NULL,
  `is_parent` tinyint(1) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `use_flag` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `value`; -- 属性值表
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `value` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `use_flag` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个表看的不是很明白,等再继续研究一段时间再回来看看这个库是如何设计的。哪位大牛看的明白欢迎在下面留言。

第二种:

/*
Navicat MySQL Data Transfer

Source Server         : LocalHost
Source Server Version : 50537
Source Host           : localhost:3306
Source Database       : sku1

Target Server Type    : MYSQL
Target Server Version : 50537
File Encoding         : 65001

Date: 2017-07-07 17:12:41
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for brand
-- ----------------------------
DROP TABLE IF EXISTS `brand`;
CREATE TABLE `brand` (
  `b_id` int(12) NOT NULL AUTO_INCREMENT,
  `b_name` varchar(50) DEFAULT NULL,
  `i_id` int(12) DEFAULT NULL,
  PRIMARY KEY (`b_id`),
  KEY `i_rel_bid` (`i_id`),
  KEY `b_name` (`b_name`),
  CONSTRAINT `i_rel_bid` FOREIGN KEY (`i_id`) REFERENCES `item` (`i_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of brand
-- ----------------------------
INSERT INTO `brand` VALUES ('1', '李宁', '2');
INSERT INTO `brand` VALUES ('2', '耐克', '2');
INSERT INTO `brand` VALUES ('3', '李宁', '4');
INSERT INTO `brand` VALUES ('4', '耐克', '4');
INSERT INTO `brand` VALUES ('5', '红蜻蜓', '1');
INSERT INTO `brand` VALUES ('6', '东方骆驼', '4');
INSERT INTO `brand` VALUES ('7', '婷美', '4');
INSERT INTO `brand` VALUES ('8', 'Chanel', '5');
INSERT INTO `brand` VALUES ('9', 'CoCo', '7');
INSERT INTO `brand` VALUES ('10', 'Amani', '8');

-- ----------------------------
-- Table structure for item
-- ----------------------------
DROP TABLE IF EXISTS `item`;
CREATE TABLE `item` (
  `i_id` int(12) NOT NULL AUTO_INCREMENT,
  `i_name` varchar(50) DEFAULT NULL,
  `i_parent_id` int(12) DEFAULT NULL,
  PRIMARY KEY (`i_id`),
  KEY `i_fk_i` (`i_parent_id`),
  CONSTRAINT `i_fk_i` FOREIGN KEY (`i_parent_id`) REFERENCES `item` (`i_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of item
-- ----------------------------
INSERT INTO `item` VALUES ('1', '服装/鞋包', null);
INSERT INTO `item` VALUES ('2', '男装', '1');
INSERT INTO `item` VALUES ('3', '流行男鞋', '1');
INSERT INTO `item` VALUES ('4', '女装', '1');
INSERT INTO `item` VALUES ('5', '箱包', null);
INSERT INTO `item` VALUES ('6', '双肩包', '5');
INSERT INTO `item` VALUES ('7', '单肩包', '5');
INSERT INTO `item` VALUES ('8', '行李箱', '5');
INSERT INTO `item` VALUES ('9', '其他', null);

-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `p_id` int(12) NOT NULL AUTO_INCREMENT,
  `p_name` varchar(50) DEFAULT NULL,
  `b_name` varchar(50) DEFAULT NULL,
  `p_fk_p` int(12) DEFAULT NULL,
  `p_fk_i` int(12) DEFAULT NULL,
  PRIMARY KEY (`p_id`),
  KEY `bname_rel_p` (`b_name`),
  KEY `p_rel_p` (`p_fk_p`),
  KEY `i_rel_p` (`p_fk_i`),
  CONSTRAINT `i_rel_p` FOREIGN KEY (`p_fk_i`) REFERENCES `item` (`i_id`),
  CONSTRAINT `bname_rel_p` FOREIGN KEY (`b_name`) REFERENCES `brand` (`b_name`),
  CONSTRAINT `p_rel_p` FOREIGN KEY (`p_fk_p`) REFERENCES `product` (`p_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES ('1', '球鞋', '李宁', null, '1');
INSERT INTO `product` VALUES ('2', '网球', '李宁', null, '9');
INSERT INTO `product` VALUES ('3', '衬衫', '李宁', null, '1');
INSERT INTO `product` VALUES ('4', '袜子', '李宁', null, '1');
INSERT INTO `product` VALUES ('5', '球鞋', '耐克', null, '1');
INSERT INTO `product` VALUES ('6', 'Air', '耐克', null, '1');
INSERT INTO `product` VALUES ('7', '袜子', '耐克', null, '1');
INSERT INTO `product` VALUES ('8', '乒乓球', '耐克', null, '9');
INSERT INTO `product` VALUES ('9', '高跟鞋', '红蜻蜓', null, '1');
INSERT INTO `product` VALUES ('10', '水晶鞋', '红蜻蜓', null, '1');
INSERT INTO `product` VALUES ('11', '凉鞋', '婷美', null, '1');
INSERT INTO `product` VALUES ('12', '皮鞋', '婷美', null, '1');
INSERT INTO `product` VALUES ('13', '高跟鞋', '婷美', null, '1');
INSERT INTO `product` VALUES ('14', 'Air1', '耐克', '6', '1');
INSERT INTO `product` VALUES ('15', 'Air2', '耐克', '6', '1');
INSERT INTO `product` VALUES ('16', 'Air3', '耐克', '6', '1');

-- ----------------------------
-- Table structure for product_pro
-- ----------------------------
DROP TABLE IF EXISTS `product_pro`;
CREATE TABLE `product_pro` (
  `pp_id` int(12) NOT NULL AUTO_INCREMENT,
  `pp_fk_p` int(12) DEFAULT NULL,
  `pp_fk_pv` int(12) DEFAULT NULL,
  `pp_fk_pn` int(12) DEFAULT NULL,
  PRIMARY KEY (`pp_id`),
  KEY `pv_rel_pp` (`pp_fk_pv`),
  KEY `p_rel_pp` (`pp_fk_p`),
  KEY `pn_rel_pp` (`pp_fk_pn`),
  CONSTRAINT `pn_rel_pp` FOREIGN KEY (`pp_fk_pn`) REFERENCES `pro_name` (`pro_id`),
  CONSTRAINT `pv_rel_pp` FOREIGN KEY (`pp_fk_pv`) REFERENCES `pro_value` (`pv_id`),
  CONSTRAINT `p_rel_pp` FOREIGN KEY (`pp_fk_p`) REFERENCES `product` (`p_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of product_pro
-- ----------------------------
INSERT INTO `product_pro` VALUES ('9', '1', '1', '1');
INSERT INTO `product_pro` VALUES ('10', '1', '2', '1');
INSERT INTO `product_pro` VALUES ('11', '1', '3', '2');
INSERT INTO `product_pro` VALUES ('12', '1', '4', '2');
INSERT INTO `product_pro` VALUES ('13', '1', '5', '2');
INSERT INTO `product_pro` VALUES ('14', '1', '6', '3');
INSERT INTO `product_pro` VALUES ('15', '1', '7', '3');
INSERT INTO `product_pro` VALUES ('16', '1', '8', '3');

-- ----------------------------
-- Table structure for product_sku
-- ----------------------------
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku` (
  `ps_id` int(12) NOT NULL AUTO_INCREMENT,
  `pd_fk_id` int(12) DEFAULT NULL,
  `pd_num` int(11) DEFAULT NULL,
  `pd_price` decimal(10,4) DEFAULT NULL,
  `pd_name` varchar(50) DEFAULT NULL,
  `pd_properties` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`ps_id`),
  KEY `p_rel_ps` (`pd_fk_id`),
  CONSTRAINT `p_rel_ps` FOREIGN KEY (`pd_fk_id`) REFERENCES `product` (`p_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of product_sku
-- ----------------------------
INSERT INTO `product_sku` VALUES ('1', '1', '53', '528.5000', '李宁-A79-12球鞋(红,亚麻,北美)', '1;3;6;');
INSERT INTO `product_sku` VALUES ('2', '1', '23', '238.9000', '李宁-A79-12球鞋(绿,塑料,中国)', '2;4;8;');
INSERT INTO `product_sku` VALUES ('3', '1', '10', '370.0000', '李宁-A21-11球鞋(绿,针织,南非)', '2;5;7;');
INSERT INTO `product_sku` VALUES ('4', '2', '12', '123.3000', '李宁-B1-12网球(红,针织,南非)', '1;5;7;');
INSERT INTO `product_sku` VALUES ('5', '2', '19', '250.0000', '李宁-B3-18网球(绿,针织,南非)', '2;5;7;');
INSERT INTO `product_sku` VALUES ('6', '3', '12', '200.0000', '李宁-A-12衬衫(绿,针织,南非)', '2;5;7;');
INSERT INTO `product_sku` VALUES ('7', '4', '10', '10.0000', '李宁-C-12袜子(绿,针织,南非)', '2;5;7;');
INSERT INTO `product_sku` VALUES ('9', '5', '5', '498.5000', '耐克-A79-12球鞋(绿,亚麻,北美)', '2;3;6;');
INSERT INTO `product_sku` VALUES ('10', '5', '25', '498.5000', '耐克-A79-12球鞋(绿,塑料,北美)', '2;4;6;');
INSERT INTO `product_sku` VALUES ('11', '5', '20', '498.5000', '耐克-A79-12球鞋(绿,塑料,南非)', '2;4;7;');
INSERT INTO `product_sku` VALUES ('13', '14', '1', '238.9000', '耐克Air1-A102-23球鞋(绿,亚麻,中国)', '2;3;8;');
INSERT INTO `product_sku` VALUES ('14', '14', '2', '250.9000', '耐克Air1-A102-23球鞋(绿,针织,北美)', '2;5;6;');
INSERT INTO `product_sku` VALUES ('15', '15', '22', '200.9000', '耐克Air2-A102-23球鞋(绿,针织,南非)', '2;5;7;');
INSERT INTO `product_sku` VALUES ('16', '16', '12', '200.9000', '耐克Air3-A21-11球鞋(红,亚麻,北美)', '1;3;6;');
INSERT INTO `product_sku` VALUES ('17', '12', '12', '200.9000', '婷美-A21-11凉鞋(红,亚麻,南非)', '1;3;7;');
INSERT INTO `product_sku` VALUES ('18', '12', '12', '238.9000', '婷美-A21-11凉鞋(红,亚麻,中国)', '1;3;8;');
INSERT INTO `product_sku` VALUES ('19', '12', '12', '320.9000', '婷美-A21-11凉鞋(红,塑料,南非)', '2;4;8;');

-- ----------------------------
-- Table structure for pro_name
-- ----------------------------
DROP TABLE IF EXISTS `pro_name`;
CREATE TABLE `pro_name` (
  `pro_id` int(12) NOT NULL AUTO_INCREMENT,
  `pro_name` varchar(50) DEFAULT NULL,
  `pro_fk_iid` int(12) DEFAULT NULL,
  `pro_has_otherName` char(2) NOT NULL DEFAULT '0',
  `pro_has_color` char(2) NOT NULL DEFAULT '0',
  `pro_has_enum` char(2) NOT NULL DEFAULT '0',
  `pro_has_input` char(2) NOT NULL DEFAULT '0',
  `pro_is_key` char(2) NOT NULL DEFAULT '0',
  `pro_is_sale` char(2) NOT NULL DEFAULT '0',
  `pro_is_must` char(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`pro_id`),
  KEY `i_ref_pn` (`pro_fk_iid`),
  CONSTRAINT `i_ref_pn` FOREIGN KEY (`pro_fk_iid`) REFERENCES `item` (`i_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of pro_name
-- ----------------------------
INSERT INTO `pro_name` VALUES ('1', '颜色', '1', '0', '1', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('2', '材质', '1', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('3', '厂商', '1', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('4', '尺码', '1', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('5', '面值', '5', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('6', '渠道', '5', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `pro_name` VALUES ('15', '鞋跟', '3', '0', '0', '0', '0', '0', '0', '0');

-- ----------------------------
-- Table structure for pro_value
-- ----------------------------
DROP TABLE IF EXISTS `pro_value`;
CREATE TABLE `pro_value` (
  `pv_id` int(12) NOT NULL AUTO_INCREMENT,
  `pv_name` varchar(50) DEFAULT NULL,
  `pv_fk_pid` int(12) DEFAULT NULL,
  PRIMARY KEY (`pv_id`),
  KEY `pn_rel_pv` (`pv_fk_pid`),
  CONSTRAINT `pn_rel_pv` FOREIGN KEY (`pv_fk_pid`) REFERENCES `pro_name` (`pro_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of pro_value
-- ----------------------------
INSERT INTO `pro_value` VALUES ('1', '红', '1');
INSERT INTO `pro_value` VALUES ('2', '绿', '1');
INSERT INTO `pro_value` VALUES ('3', '亚麻', '2');
INSERT INTO `pro_value` VALUES ('4', '塑料', '2');
INSERT INTO `pro_value` VALUES ('5', '针织', '2');
INSERT INTO `pro_value` VALUES ('6', '北美工厂店', '3');
INSERT INTO `pro_value` VALUES ('7', '南非工厂店', '3');
INSERT INTO `pro_value` VALUES ('8', '中国制造', '3');
INSERT INTO `pro_value` VALUES ('9', '高脚鞋跟', '15');
INSERT INTO `pro_value` VALUES ('10', '平底鞋跟', '15');
INSERT INTO `pro_value` VALUES ('11', '尖顶鞋跟', '15');

这张表因为有插入的数据,可以比较清楚的表示出每个表的内容。具体深入,还要在业务中不断学习,才能完全看懂这个表,并根据业务来扩展这张表。


其它相关推荐:

1、不同产品不同属性产品表的设计

2、商城 商品模块 数据库 表设计

3、类似淘宝关于产品详情页的数据库存储是怎么存储的呢?

4、mysql省市区信息表

5、国家省市数据库


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - 两种商品数据库的MySQL代码

分享到:

发表评论

评论列表