电子商城后台系统(六):商品模块的数据库及实体类设计

既然是到详细设计阶段,那肯定是要将前端和后端合起来考虑的。

在前端展示的时候,都会有一个列表页面,列表页面会列出商品的一些简要信息,在用户端、后台管理系统,都会有。然后,每条简要的信息,可以点进去,查看某个商品的详细信息。对于这种情况,我之前看过一些开发的做法,都是用一个类来描述,在列表页面显示商品的时候,就把商品的所有信息都查了出来,只是前端在展示的时候,只选择一部分信息展示。但是一个商品的详情信息,通常是来自于几张表,也就意味着,首页只需要展示商品的几条信息,而后端却查询了很多不必要的表,后果就是用户在打开首页,或是后台管理员打开列表页面的时候,加载缓慢。这种情况下,最好是用两个类来描述商品,先用一个类,描述商品的概要信息,再用一个类,继承概要信息的类,把商品的详情信息描述完。那么,在设计数据库的时候,就要尽量把商品的概要信息,都放到一张表里面,这样,在首页的列表展示商品的时候,只需要查询一张表就可以了。当然,在实际中,用一张表可以描述完商品的概要信息,但首页显示的数据,通常只查一张表是实现不了需求的,比如,首页显示的商品要依据销量倒序排列,而销量是来自于订单模块的表,只查一张表的话,就做不到了。只能是尽量做到少查表,不是必须查的表,就不查。

在后台管理系统里,可以做成所有的图片,统一进行管理,那么就需要设计一个图片类,数据库中也需要设计一张表,用于存储图片的信息。所以,这张图片的表,就是需要建的第一张表,建表语句:

CREATE TABLE image(
	id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增长主键id',
	name VARCHAR(50) COMMENT '用户上传时的图片名称',
	addr VARCHAR(100) NOT NULL COMMENT '图片地址',
	user_id INT COMMENT '图片上传者的id',
	create_time TIMESTAMP COMMENT '图片上传时间'
)COMMENT '图片管理表' ENGINE=INNODB DEFAULT charset=utf8;

商品表,建表语句:

CREATE TABLE goods(
		id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品id,主键,自增长',
		name VARCHAR(100) NOT NULL COMMENT '商品名称,不能为空',
		short_name VARCHAR(100) COMMENT '商品短名称',
		length DOUBLE COMMENT '商品的长度',
		width DOUBLE COMMENT '商品的宽度',
		height DOUBLE COMMENT '商品的高度',
		weight DOUBLE COMMENT '商品的重量',
		image_id INT NOT NULL COMMENT '商品主图的id',
		detail_show_image CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '商品的详情页,是否显示主图,默认为显示',
		cost_price DOUBLE COMMENT '商品成本价',
		selling_price DOUBLE NOT NULL COMMENT '商品售价,不能为空',
		original_price DOUBLE COMMENT '商品原价',
		detail TEXT COMMENT '商品的详情信息',
		basic_stock INT DEFAULT 0 COMMENT '商品的库存,默认值为0',
		upperShelf CHAR(1) DEFAULT 'N' COMMENT '商品是否上架,默认为否',
		spec CHAR(1) DEFAULT 'N' COMMENT '是否开启多规格,默认为否',
		examine CHAR(1) DEFAULT 'N' COMMENT '是否审核,默认为否',
		delete CHAR(1) DEFAULT 'N' COMMENT '是否为逻辑删除状态,默认为否',
		create_time TIMESTAMP NOT NULL DEFAULT 0 COMMENT '商品创建时间,不能为空,默认为0',
		update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '商品修改时间,不能为空,默认为数据插入时间,数据更改时,自动同步为修改时的时间'
)COMMENT '商品基本信息表' ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品副图,也就是商品的详情页面的轮播图片,建表语句:

CREATE TABLE goods_image(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增长主键id',
goods_id INT COMMENT '商品的id',
image_id INT COMMENT '图片的id',
sort INT COMMENT '排序',
CONSTRAINT fk_goods_image1 FOREIGN KEY(goods_id) REFERENCES goods(id),
CONSTRAINT fk_goods_image2 FOREIGN KEY(image_id) REFERENCES image(id)
)COMMENT '商品副图映射表' ENGINE=INNODB DEFAULT CHARSET=utf8;

商品类目表,用于划分商品的类目,由于商品与商品分类是多对多的关系,所以有类目表,还有映射表,建表语句:

CREATE TABLE goods_category(
id INT AUTO_INCREMENT COMMENT '自增长id',
category_name VARCHAR(50) NOT NULL COMMENT '类目名称',
lev INT NOT NULL DEFAULT 1 COMMENT '类目的层级',
parent INT DEFAULT 0 COMMENT '父类目id',
PRIMARY KEY(id)
)COMMENT '商品类目表' ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE goods_category_mapping (
goods_id INT NOT NULL COMMENT '商品id',
category_id INT NOT NULL COMMENT '类目id',
PRIMARY KEY(goods_id,category_id),
CONSTRAINT fk_goods_id_mapping FOREIGN KEY (goods_id) REFERENCES goods(id),
CONSTRAINT fk_category_id_mapping FOREIGN KEY (category_id) REFERENCES goods_category(id)
)COMMENT '商品与类目的映射关系表' ENGINE=INNODB DEFAULT CHARSET=utf8;

商品分组,与商品分类,差不多,建表语句:

CREATE TABLE goods_group(
id INT NOT NULL AUTO_INCREMENT COMMENT '商品组id',
group_name VARCHAR(50) NOT NULL COMMENT '组名',
PRIMARY KEY(id)
)COMMENT '商品组表' ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE goods_group_mapping (
goods_id INT NOT NULL COMMENT '商品id',
group_id INT NOT NULL COMMENT '商品组id',
PRIMARY KEY(goods_id,group_id),
CONSTRAINT fk_goods_id_group FOREIGN KEY (goods_id) REFERENCES goods(id),
CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES goods_group(id)
)COMMENT '商品组与商品的映射关系表' ENGINE=INNODB DEFAULT CHARSET=utf8;

然后,商品还会有多规格的情况,比如衣服,有颜色、大小等,所以还有规格表、规格项表,建表语句:

CREATE TABLE goods_spec(
id INT AUTO_INCREMENT COMMENT '自增长id',
goods_id INT NOT NULL COMMENT '商品id',
spec_name VARCHAR(50) COMMENT '规格名称',
sort INT COMMENT '规格的序号',
PRIMARY KEY(id),
CONSTRAINT fk_goods_id FOREIGN KEY(goods_id) REFERENCES goods(id) 
)COMMENT '商品规格信息表' ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE goods_spec_item(
id INT AUTO_INCREMENT COMMENT '自增长id',
spec_id INT NOT NULL COMMENT '规格id',
item_name VARCHAR(50) COMMENT '规格项的名称',
sort INT COMMENT '规格项的序号',
PRIMARY KEY(id),
CONSTRAINT fk_spec_id FOREIGN KEY(spec_id) REFERENCES goods_spec(id) 
)COMMENT '商品规格项信息表' ENGINE=INNODB DEFAULT CHARSET=utf8;

然后,就是规格项的各种组合信息,也需要一张表来描述,一件衣服,红的要贵5块钱,需要在组合表里描述,还有各个组合的库存等,建表语句就是:

CREATE TABLE goods_spec_item_detail(
id INT AUTO_INCREMENT COMMENT 'id',
goods_id INT NOT NULL COMMENT '商品id',
item_group VARCHAR(5) NOT NULL COMMENT '商品规格项的组合,一个商品最多支持添加四个规格,加一个字母前缀,最多五个字符',
cost_price DOUBLE COMMENT '规格组合的成本价',
selling_price DOUBLE NOT NULL COMMENT '规格组合的出售价',
stock INT NOT NULL DEFAULT 0 COMMENT '规格组合的库存',
PRIMARY KEY(id),
CONSTRAINT fk_goods_id_item FOREIGN KEY (goods_id) REFERENCES goods(id)
)COMMENT '商品规格项组合信息表' ENGINE=INNODB DEFAULT CHARSET=utf8;

这样,商品模块的整个规划就出来了,不过,这只是一个很简单的设计,还可以扩展很多其它的信息进来,依情况添加吧。比如在这里面,所有表引用图片表的数据,都没有加外键,所以对图片进行删除的时候,就可能引起异常,如果加外键,会让很多操作不方便 ,所以可以弄一张图片引用关系表,其实就是一张配置表,有哪几张表,引用了图片表的数据,如果要删除一张图片,那么就会先去引用了图片数据的表里查询,是否有引用这张图片,如果有被引用,就要提示用户,先去相应的模块里处理对这张图片的引用,才能删除。

欢迎加入测试群:91425817,一起讨论测试的那此事。

发布了47 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/kingzhsh/article/details/88911262