这么设计商品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='商品规格值记录表';
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10
wuchenge

spec_sku_id 这个字段用来干什么?

3个月前 评论
sanders

楼主没有细说业务场景,我就猜一下:

第一个问题是没有看到 SKU 表,至少从表名上没有看到。我理解的 SKU 的含义应该是商品最小粒度的规格单元,无论在售卖还是进销存过程中都是基于它作为实体进行的(非标件的场景会附加更多信息,如:成色、品质等)。所以为了和上下游的业务对齐,应该有一张 SKU 表。

对于批发零售场景来说,商品是包装展示给客户的内容,同样是对 SKU 的组织。零售方面组织形式中,淘宝采用的是商品为主,而京东采用的是 SKU 为主。这需要根据产品的需求选择哪种展现方式。如果是 SKU 为主,那么商品和 SKU 之间 一对多的关系便能简单满足需求,但如果是商品为主则可能需要多对多的关系,同时下单的主体也会变为这层关系。

如果是单店系统,库存直接存在 SKU 或 商品规格的字段上是没问题的。但如果考虑多个售卖主体(店)的时候,库存就应该单独出至少一张表,用来保存当前售卖方、SKU 和 数量,并应该根据订单状态记录被订单锁定的库存数量。

3个月前 评论
PHPisGod (楼主) 3个月前
sanders (作者) 3个月前

大致盲猜索引加的不对

3个月前 评论

有以下几点想法,共同探讨一下:

  • ta_goods_sku.goods_no 字段如果有需要检索,可以考虑加索引;
  • ta_goods_sku.goods_weight 这个字段目前定义为 double,感觉这个还有斟酌空间,主要看对这个值准确度是否敏感;
  • 感觉所的有 varchar 字段的长度在够用范围内可以尽量小;
  • 如果有需要对 ta_spec_value 表做检索,可以考虑加 goods_id 做冗余
3个月前 评论
PHPisGod (楼主) 3个月前

如果您要抽出一个规格组的概念。那以上的表格似乎还少了一个规格表,一个规格组一对多对应一组的规格,规格一对多对应一组的规格值。而商品则是多对多对应规格组。这样一个商品可以共用公用的规格组,还可以有自己个性化的规格组。

不知道我理解对不对?

3个月前 评论
PHPisGod (楼主) 3个月前

参考下市面上比较成熟的产品,比如shopNc等等,参考下他们的数据表结构就差不多了

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!