这么设计商品SKU表如何,有什么改进空间和理由
再一些销售型公司的内部CRM/SCRM系统中对商品的销售,如下这样设计商品的SKU是否合理,有什么改进空间欢迎大神指点(后期会对商品进行各种数据分析是否可以准确有效)
CREATE TABLE `ta_goods` (
`goods_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id',
`goods_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
`selling_point` varchar(500) NOT NULL DEFAULT '' COMMENT '商品卖点',
`spec_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '商品规格(10单规格 20多规格)',
PRIMARY KEY (`goods_id`),
) ENGINE=InnoDB AUTO_INCREMENT=10794 DEFAULT CHARSET=utf8 COMMENT='商品记录表’;
CREATE TABLE `ta_goods_sku` (
`goods_sku_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品规格id',
`goods_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
`spec_sku_id` varchar(255) NOT NULL DEFAULT '0' COMMENT '商品sku记录索引 (由规格id组成)',
`image_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格图片id',
`goods_no` varchar(100) NOT NULL DEFAULT '' COMMENT '商品编码',
`goods_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '商品价格',
`line_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '商品划线价',
`stock_num` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '当前库存数量',
`goods_sales` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '商品销量',
`goods_weight` double unsigned NOT NULL DEFAULT '0' COMMENT '商品重量(Kg)',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`goods_sku_id`),
UNIQUE KEY `sku_idx` (`goods_id`,`spec_sku_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12104 DEFAULT CHARSET=utf8 COMMENT='商品规格表’;
CREATE TABLE `ta_goods_spec_rel` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`goods_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
`spec_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格组id',
`spec_value_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格值id',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11364 DEFAULT CHARSET=utf8 COMMENT='商品与规格值关系记录表’;
CREATE TABLE `ta_spec` (
`spec_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '规格组 id',
`spec_name` varchar(255) NOT NULL DEFAULT '' COMMENT '规格组名称',
`create_time` int(11) NOT NULL COMMENT '创建时间',
PRIMARY KEY (`spec_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10035 DEFAULT CHARSET=utf8 COMMENT='商品规格组记录表';
CREATE TABLE `ta_spec_value` (
`spec_value_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '规格值 id',
`spec_value` varchar(255) NOT NULL COMMENT '规格值',
`spec_id` int(11) NOT NULL COMMENT '规格组 id',
`create_time` int(11) NOT NULL COMMENT '创建时间',
PRIMARY KEY (`spec_value_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10484 DEFAULT CHARSET=utf8 COMMENT='商品规格值记录表';
楼主没有细说业务场景,我就猜一下:
第一个问题是没有看到 SKU 表,至少从表名上没有看到。我理解的 SKU 的含义应该是商品最小粒度的规格单元,无论在售卖还是进销存过程中都是基于它作为实体进行的(非标件的场景会附加更多信息,如:成色、品质等)。所以为了和上下游的业务对齐,应该有一张 SKU 表。
对于批发零售场景来说,商品是包装展示给客户的内容,同样是对 SKU 的组织。零售方面组织形式中,淘宝采用的是商品为主,而京东采用的是 SKU 为主。这需要根据产品的需求选择哪种展现方式。如果是 SKU 为主,那么商品和 SKU 之间 一对多的关系便能简单满足需求,但如果是商品为主则可能需要多对多的关系,同时下单的主体也会变为这层关系。
如果是单店系统,库存直接存在 SKU 或 商品规格的字段上是没问题的。但如果考虑多个售卖主体(店)的时候,库存就应该单独出至少一张表,用来保存当前售卖方、SKU 和 数量,并应该根据订单状态记录被订单锁定的库存数量。
大致盲猜索引加的不对
有以下几点想法,共同探讨一下:
ta_goods_sku.goods_no
字段如果有需要检索,可以考虑加索引;ta_goods_sku.goods_weight
这个字段目前定义为double
,感觉这个还有斟酌空间,主要看对这个值准确度是否敏感;varchar
字段的长度在够用范围内可以尽量小;ta_spec_value
表做检索,可以考虑加goods_id
做冗余如果您要抽出一个规格组的概念。那以上的表格似乎还少了一个规格表,一个规格组一对多对应一组的规格,规格一对多对应一组的规格值。而商品则是多对多对应规格组。这样一个商品可以共用公用的规格组,还可以有自己个性化的规格组。
不知道我理解对不对?
参考下市面上比较成熟的产品,比如shopNc等等,参考下他们的数据表结构就差不多了