一个电商项目的数据库设计实践(第一部分)(附源码)

东易买电商平台项目源码分析与实践 东易买项目是一个旨在打造新一代电商平台的大型项目,它不仅需要满足快速迭代和市场变化的需求,还要具备高性能和高可用性的特点。作为行业内的一大亮点,东易买项目将成为一个集用户购物、商家管理、订单处理、支付集成和数据分析于一体的综合性在线交易平台。 阅读详情

1.准备工作

数据库:MySQL5.7(5.5、5.6皆可);
数据库客户端软件:SQLyog;
源码在Github上:https://github.com/Fateasstring/EB-SQL ,文章整理不易,请赏个star吧。

2.用户实体

用户模块用于管理和维护用户信息。把所有的用户信息放在一个表中,会容易导致:

  • 数据插入异常;
  • 数据更新异常,比如要修改某一行的值是,不得不修改多行数据;
  • 数据删除异常,删除某一数据时不得不同时删除另一数据;
  • 数据存在冗余; 数据表过宽,会影响修改表结构的效率。

第三范式(3NF)定义:一个表中的列和其它列之间,即不包含部分函数依赖关系,也不包含传递函数依赖关系,那么这个表的设计就符合第三范式。

设计方式:
用户登陆表:{登录名,密码,用户状态}
用户地址表:{省,市,区编码,地址}
用户信息表:{用户姓名,证件类型,证件号码,手机号,邮箱,性别,积分,注册时间,生日,会员级别,用户余额}

2.1 用户登陆表(customer_login)

CREATE table customer_login(

customer_id int UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '用户ID',

login_name VARCHAR(20) NOT NULL COMMENT '用户登陆名',
password CHAR(32) not NULL COMMENT 'md5加密的密码',

user_stats TINYINT NOT null DEFAULT 1 COMMENT '用户状态',

modified_time timestamp NOT null 
default  CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY key pk_customerid(customer_id)

)engine = INNODB COMMENT = '用户登录表';

2.2 用户信息表(customer_inf)

CREATE table customer_inf(

customer_inf_id int UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '自增主键ID',

customer_id int UNSIGNED NOT NULL COMMENT 'customer_login表的自增ID',

customer_name VARCHAR(20) not null COMMENT '用户真实姓名',

identity_card_type TINYINT not null 
DEFAULT 1 COMMENT '证件类型:1 身份证,2 军官证, 3 护照',

identity_card_no VARCHAR(20) COMMENT '证件号码',

mobile_phone int UNSIGNED COMMENT '手机号',

customer_email VARCHAR(50) COMMENT '邮箱',

gender CHAR(1) COMMENT '性别',

user_point int NOT NULL DEFAULT 0 COMMENT '用户积分',

register_time timestamp not null COMMENT '注册时间',
  
birthday datetime COMMENT '会员生日',

customer_level TINYINT NOT null 
DEFAULT 1 COMMENT '会员级别:1.普通会员,2.青铜会员,3.白银会员,4.黄金会员,5.钻石会员',

user_money DECIMAL(8,2) NOT null DEFAULT 0.00 COMMENT '用户余额',

modified_time timestamp NOT null 
DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

primary key pk_customerinfid (customer_inf_id)

)ENGINE = INNODB COMMENT '用户信息表';

2.3 用户级别表(customer_level_inf)

CREATE table customer_level_inf(

customer_level TINYINT not NULL auto_increment COMMENT '会员级别ID',

level_name VARCHAR(10) NOT NULL COMMENT '会员级别名称',

min_point int UNSIGNED not null DEFAULT 0 COMMENT '该级别最低积分',

max_point int UNSIGNED not null DEFAULT 0 COMMENT '该级别最高积分',

modified_time timestamp not null 
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

primary key pk_levelid(customer_level)  

)ENGINE = INNODB COMMENT '用户级别信息表';

2.4 用户地址表(customer_addr)

CREATE TABLE customer_addr(
customer_addr_id int UNSIGNED AUTO_INCREMENTnot null COMMENT'自增主键ID',

customer_id int UNSIGNED not NULL COMMENT 'customer_login表的自增ID',

zip SMALLINT not null COMMENT '邮编',

province SMALLINT not null COMMENT '地区表中省份的id',

city SMALLINT not null COMMENT '地区表中城市的id',

district SMALLINT not null COMMENT '地区表中的区id',

address VARCHAR(200) not null COMMENT '具体的地址门牌号',

is_default TINYINT not null COMMENT '是否默认',

modified_time timestamp not null 
DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

primary key pk_customeraddid (customer_addr_id)
		
)ENGINE = INNODB COMMENT '用户地址表';

2.5 用户积分日志表(customer_point_log)

CREATE TABLE customer_point_log(

point_id int UNSIGNED not null AUTO_INCREMENT COMMENT '积分日志ID',

customer_id int UNSIGNED not null COMMENT '用户id',
source TINYINT UNSIGNED not null COMMENT '积分来源:0.订单,1.登陆,2.活动',

refer_number int UNSIGNED not null DEFAULT 0 COMMENT '积分来源相关编号',

change_point SMALLINT not null DEFAULT 0 COMMENT '变更积分数',

create_time timestamp not null COMMENT '积分日志生成时间',

primary key pk_point(point_id)

)ENGINE = INNODB COMMENT '用户积分日志表';

2.6 用户余额变动表(customer_balance_log)

CREATE table customer_balance_log(

balance_id int UNSIGNED not null AUTO_INCREMENT COMMENT '余额日志id',

customer_id int UNSIGNED not null COMMENT '用户id',
source TINYINT UNSIGNED not null DEFAULT 1 COMMENT '记录来源:1.订单,2.退货单',

source_sn int UNSIGNED not null COMMENT '相关单据id',

create_time timestamp not null DEFAULT current_timestamp COMMENT '记录生成时间',

amount DECIMAL(8,2) not null DEFAULT 0.00 COMMENT '变动金额',

primary key pk_balanceid (balance_id)

)ENGINE = INNODB COMMENT '用户余额变动表';

2.7 用户登录日志表(customer_login_log)

```sql
CREATE table customer_login_log(

login_id int UNSIGNED not null AUTO_INCREMENT COMMENT '登录日志id',

customer_id int UNSIGNED NOT null COMMENT '登录用户id',

login_time timestamp not null COMMENT '用户登录时间',

login_ip int UNSIGNED not null COMMENT '登录ip',

login_type TINYINT not null COMMENT '登录类型:0.未成功,1.成功',

primary key pk_loginid(login_id)

)ENGINE = INNODB COMMENT '用户登陆日志表'

3.customer_login_log分区

3.1 customer_login_log表分区

业务使用场景:用户登录日志表主要用于用户每次登录的记录,每次登录时会在表中增加一条日志,所以数据量增长很快。为了尽可能保持生产环境数据库不会因为日志表增长而过快增长,用户登录日志只保存一年。

1)登录日志表的分区类型及分区键

这样的场景使用范围(RANGE)分区比较适合,可以很方便删除分区范围的数据,特别时数据量大的时候会方便很多。
这里以login_time作为分区键。

2)分区后的用户登录日志表

```sql
CREATE table customer_login_log(
customer_id int UNSIGNED NOT null ,
login_time DATETIME not null ,
login_ip int UNSIGNED not null ,
login_type TINYINT not null 
)ENGINE = INNODB 
PARTITION by RANGE(YEAR(login_time))
(PARTITION p0 VALUES less than(2015),
PARTITION p1 VALUES less than(2016),
PARTITION p2 VALUES less than(2017)
);

插入数据:

INSERT into customer_login_log(customer_id, login_time, login_ip, login_type)VALUES
(1001,'2015-01-25',0,1),
(1001,'2015-07-1',0,1),
(1001,'2015-10-1',0,1),
(1001,'2016-3-1',0,1),
(1001,'2016-9-1',0,1)

表中的数据为:
在这里插入图片描述
​
执行下列SQL语句:

SELECT 
table_name, 
partition_name, 
partition_description, 
table_rowsFROM information_schema.`PARTITIONS`
WHERE TABLE_NAME = 'customer_login_log'

得到结果:
在这里插入图片描述
为了避免数据插入到RANGE分区失败,要做修改并添加分区的计划任务。
增加分区:

ALTER TABLE customer_login_log ADD partition (partition p4 VALUES less than(2018));

再次查询分区信息表得到结果:
​在这里插入图片描述
接下来删除p0分区:

ALTER TABLE customer_login_log DROP partition p0;

再次查询分区信息表得到结果:
​在这里插入图片描述
所以,可以用这种方式删除过期日志,十分便捷。

3)分区数据归档

分区数据迁移条件:

  • MySQL版本>=5.7;
  • 结构相同;
  • 归档到的数据表一定要是非分区表(非临时表);
  • 非临时表,不能有外键约束;
  • 归档引擎要是archive。

首先建立一个与分区表结构相同的非分区表,作为归档表:

CREATE table arch_customer_login_log(
customer_id int UNSIGNED NOT null ,
login_time DATETIME not null ,
login_ip int UNSIGNED not null ,
login_type TINYINT not null 
)ENGINE = INNODB 

执行命令:

SELECT *FROM customer_login_log;

可以看到数据在customer_login_log中的情况:
​在这里插入图片描述
现在将这些数据交换到归档表中:

ALTER TABLE customer_login_log exchange PARTITION p1 WITH TABLE arch_customer_login_log;

现在查看customer_login_log中2016年之前的数据:
​在这里插入图片描述
查看arch_customer_login_log:
​在这里插入图片描述
可以看到2016前的数据已经迁移到arch_customer_login_log归档表中了。
此时customer_login_log中的p1分区依旧是是存在的,所以需要对分区p1进行删除:

ALTER TABLE customer_login_log DROP partition p1;

再一次查看customer_login_log中的分区:

SELECT 
table_name, partition_name, partition_description, table_rowsFROM 
information_schema.`PARTITIONS`WHERE 
TABLE_NAME = 'customer_login_log'

在这里插入图片描述
可以看到p1分区已经没有了。
最后arch_customer_login_log改为使用归档引擎archive:

ALTER TABLE arch_customer_login_log ENGINE=archive;

这样能就完成了整个归档操作。而使用archive引擎的好处是,它比innodb引擎占用的空间更小。但是归档引擎中的表只能进行查询操作,不能进行写操作。

3.2 使用分区表的注意事项

  • 结合业务场景选择分区,避免跨分区查询;
  • 对分区表进行查询最好在where从句中包含分区键;
  • 具有主键或唯一索引的表,主键或唯一索引必须是分区键的一部分;

4.商品实体

商品实体包含的信息如下:
​在这里插入图片描述
将这些信息分类存储在以下几个表中。

4.1 品牌信息表(brand_info)

create table brand_info(

brand_id SMALLINT unsigned auto_increment not NULL COMMENT '品牌id',

brand_name VARCHAR(50) not null COMMENT '品牌名称',

telephone VARCHAR(50) not null COMMENT '联系电话',

brand_web VARCHAR(100) COMMENT '品牌网站',

brand_logo VARCHAR(100) COMMENT '品牌logo URL',

brand_desc VARCHAR(150) COMMENT '品牌描述',

brand_status TINYINT not NULL DEFAULT 0 COMMENT '品牌状态,0.禁用,1.启用',

brand_order TINYINT not null DEFAULT 0 COMMENT '排序',

modified_time timestamp not null 
DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY key pk_brandid (brand_id)
)ENGINE = INNODB COMMENT'品牌信息表'

4.2 分类信息表(product_category)

CREATE TABLE product_category(
category_id SMALLINT UNSIGNED auto_increment not NULL COMMENT '分类id',

category_name VARCHAR(10) not NULL COMMENT '分类名称',

category_code VARCHAR(10) not NULL COMMENT '分类编码',

parent_id SMALLINT UNSIGNED not null DEFAULT 0 COMMENT '父分类id',

category_level TINYINT not null DEFAULT 1 COMMENT '分类层级',

category_status TINYINT not null DEFAULT 1 COMMENT '分类状态',

modified_time timestamp not null 
DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY key pk_categoryid(category_id)
)ENGINE = INNODB COMMENT '商品分类';

4.3 商品供应商信息表(supplier_info)

CREATE table supplier_info(
supplier_id int UNSIGNED auto_increment not null COMMENT '供应商id',

supplier_code CHAR(8) not null COMMENT '供应商编码',

supplier_name CHAR(50) not NULL COMMENT '供应商名称',

supplier_type TINYINT not NULL COMMENT '供应商类型:1.自营,2.平台',

link_man VARCHAR(10) not NULL COMMENT '供应商联系人',

phone_number VARCHAR(50) not null COMMENT '联系电话',

bank_name VARCHAR(50) not NULL COMMENT '供应商开户银行名称',

bank_account VARCHAR(50) not null COMMENT '银行账号',

address VARCHAR(200) not null COMMENT '供应商地址',

supplier_status TINYINT not null DEFAULT '0' COMMENT '状态:0.禁用,1.启用',

modified_time timestamp not null 
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY key pk_supplierid (supplier_id)
)ENGINE = INNODB COMMENT '供应商信息表';

4.4 商品信息表(product_info)

DROP TABLE IF EXISTS `product_info`;/*!40101 SET @saved_cs_client     = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `product_info` (
  `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID',

  `product_code` char(16) NOT NULL COMMENT '商品编码',

  `product_name` varchar(50) NOT NULL COMMENT '商品名称',

  `bar_code` varchar(50) NOT NULL COMMENT '国条码',

  `brand_id` int(10) unsigned NOT NULL COMMENT '品牌表的ID',

  `one_category_id` smallint(5) unsigned NOT NULL COMMENT '一级分类ID',

  `two_category_id` smallint(5) unsigned NOT NULL COMMENT '二级分类ID',

  `three_category_id` smallint(5) unsigned NOT NULL COMMENT '三级分类ID',

  `supplier_id` int(10) unsigned NOT NULL COMMENT '商品的供应商id',

  `price` decimal(8,2) NOT NULL COMMENT '商品销售价格',

  `average_cost` decimal(18,2) NOT NULL COMMENT '商品加权平均成本',

  `publish_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '上下架状态:0下架1上架',

  `audit_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态:0未审核,1已审核',

  `weight` float DEFAULT NULL COMMENT '商品重量',

  `length` float DEFAULT NULL COMMENT '商品长度',

  `heigh` float DEFAULT NULL COMMENT '商品高度',

  `width` float DEFAULT NULL COMMENT '商品宽度',

  `color_type` enum('红','黄','蓝','黒') DEFAULT NULL,

  `production_date` datetime NOT NULL COMMENT '生产日期',

  `shelf_life` int(11) NOT NULL COMMENT '商品有效期',

  `descript` text NOT NULL COMMENT '商品描述',

  `indate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品录入时间',

  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

  PRIMARY KEY (`product_id`)

) ENGINE=InnoDB AUTO_INCREMENT=262141 DEFAULT CHARSET=utf8 COMMENT='商品信息表';

4.5 商品图片表(product_pic_info)

DROP TABLE IF EXISTS `product_pic_info`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `product_pic_info` (

  `product_pic_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品图片ID',

  `product_id` int(10) unsigned NOT NULL COMMENT '商品ID',

  `pic_desc` varchar(50) DEFAULT NULL COMMENT '图片描述',

  `pic_url` varchar(200) NOT NULL COMMENT '图片URL',

  `is_master` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否主图:0.非主图1.主图',

  `pic_order` tinyint(4) NOT NULL DEFAULT '0' COMMENT '图片排序',

  `pic_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '图片是否有效:0无效 1有效',

  `modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 

    CURRENT_TIMESTAMP COMMENT '最后修改时间',

  PRIMARY KEY (`product_pic_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品图片信息表';

图片,小视频等数据,是不能直接存在MySQL数据库里的,而是存在专门的图片服务器,文件服务器或者CDN上,并把相应的地址信息存储在MySQL数据库中。

4.5 商品评论表(product_comment)

DROP TABLE IF EXISTS `product_comment`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `product_comment` (

  `comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '评论ID',

  `product_id` int(10) unsigned NOT NULL COMMENT '商品ID',

  `order_id` bigint(20) unsigned NOT NULL COMMENT '订单ID',

  `customer_id` int(10) unsigned NOT NULL COMMENT '用户ID',

  `title` varchar(50) NOT NULL COMMENT '评论标题',

  `content` varchar(300) NOT NULL COMMENT '评论内容',

  `audit_status` tinyint(4) NOT NULL COMMENT '审核状态:0未审核1已审核',

  `audit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP COMMENT '评论时间',

  `modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

  PRIMARY KEY (`comment_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品评论表';

5.订单实体

订单实体包含如下信息:
​
在这里插入图片描述

5.1 订单主表(order_master)

DROP TABLE IF EXISTS `order_master`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `order_master` (
  `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `order_sn` bigint(20) unsigned NOT NULL COMMENT '订单编号 yyyymmddnnnnnnnn',
  `customer_id` int(10) unsigned NOT NULL COMMENT '下单人ID',
  `shipping_user` varchar(10) NOT NULL COMMENT '收货人姓名',
  `province` smallint(6) NOT NULL COMMENT '收货人所在省',
  `city` smallint(6) NOT NULL COMMENT '收货人所在市',
  `district` smallint(6) NOT NULL COMMENT '收货人所在区',
  `address` varchar(100) NOT NULL COMMENT '收货人详细地址',
  `payment_method` tinyint(4) NOT NULL COMMENT '支付方式:1现金,2余额,3网银,4支付宝,5微信',
  `order_money` decimal(8,2) NOT NULL COMMENT '订单金额',
  `district_money` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额',
  `shipping_money` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '运费金额',
  `payment_money` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '支付金额',
  `shipping_comp_name` varchar(10) DEFAULT NULL COMMENT '快递公司名称',
  `shipping_sn` varchar(50) DEFAULT NULL COMMENT '快递单号',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
  `shipping_time` datetime DEFAULT NULL COMMENT '发货时间',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `receive_time` datetime DEFAULT NULL COMMENT '收货时间',
  `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态',
  `order_point` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '订单积分',
  `invoice_title` varchar(100) DEFAULT NULL COMMENT '发票抬头',
  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `ux_ordersn` (`order_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=10011 
DEFAULT CHARSET=utf8 COMMENT='订单主表';
/*!40101 SET character_set_client = @saved_cs_client */;

订单主表是非常重要的表,关系到所有经营的行为活动。

5.2 订单详情表(order_detail)

DROP TABLE IF EXISTS `order_detail`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `order_detail` (
  `order_detail_id` int(10) unsigned NOT NULL 
  AUTO_INCREMENT COMMENT '自增主键ID,订单详情表ID',
  
  `order_id` int(10) unsigned NOT NULL COMMENT '订单表ID',
  `product_id` int(10) unsigned NOT NULL COMMENT '订单商品ID',
  `product_name` varchar(50) NOT NULL COMMENT '商品名称',
  `product_cnt` int(11) NOT NULL DEFAULT '1' COMMENT '购买商品数量',
  `product_price` decimal(8,2) NOT NULL COMMENT '购买商品单价',
  `average_cost` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '平均成本价格',
  `weight` float DEFAULT NULL COMMENT '商品重量',
  `fee_money` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '优惠分摊金额',
  `w_id` int(10) unsigned NOT NULL COMMENT '仓库ID',
  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  
  PRIMARY KEY (`order_detail_id`)
) ENGINE=InnoDB AUTO_INCREMENT=29698 
DEFAULT CHARSET=utf8 COMMENT='订单详情表';
/*!40101 SET character_set_client = @saved_cs_client */;

5.3 购物车表(order_cart)

DROP TABLE IF EXISTS `order_cart`;
/*!40101 SET @saved_cs_client    
 = @@character_set_client */;
 /*!40101 SET character_set_client = utf8 */;
 CREATE TABLE `order_cart` (
  `cart_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
  `customer_id` int(10) unsigned NOT NULL COMMENT '用户ID',
  `product_id` int(10) unsigned NOT NULL COMMENT '商品ID',
  `product_amount` int(11) NOT NULL COMMENT '加入购物车商品数量',
  `price` decimal(8,2) NOT NULL COMMENT '商品价格',
  `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入购物车时间',
  `modified_time` timestamp NOT NULL
   DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`cart_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='购物车表';
/*!40101 SET character_set_client = @saved_cs_client */;

5.4 仓库信息表(warehouse_info)

DROP TABLE IF EXISTS `warehouse_info`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `warehouse_info` (
  `w_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '仓库ID',
  `warehouse_sn` char(5) NOT NULL COMMENT '仓库编码',
  `warehouse_name` varchar(10) NOT NULL COMMENT '仓库名称',
  `warehouse_phone` varchar(20) NOT NULL COMMENT '仓库电话',
  `contact` varchar(10) NOT NULL COMMENT '仓库联系人',
  `province` smallint(6) NOT NULL COMMENT '省',
  `city` smallint(6) NOT NULL COMMENT '市',
  `district` smallint(6) NOT NULL COMMENT '区',
  `address` varchar(100) NOT NULL COMMENT '仓库地址',
  `warehouse_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '仓库状态:0禁用,1启用',
  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`w_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 
DEFAULT CHARSET=utf8 COMMENT='仓库信息表';
/*!40101 SET character_set_client = @saved_cs_client */;

5.5 商品库存表(warehouse_product)

DROP TABLE IF EXISTS `warehouse_product`;
/*!40101 SET @saved_cs_client     
= @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `warehouse_product` (
  `wp_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品库存ID',
  `product_id` int(10) unsigned NOT NULL COMMENT '商品id',
  `w_id` smallint(5) unsigned NOT NULL COMMENT '仓库ID',
  `currnet_cnt` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '当前商品数量',
  `lock_cnt` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '当前占用数据',
  `in_transit_cnt` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '在途数据',
  `average_cost` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '移动加权成本',
  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`wp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品库存表';
/*!40101 SET character_set_client = @saved_cs_client */;

5.6 物流公司信息表(shipping_info)

DROP TABLE IF EXISTS `shipping_info`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `shipping_info` (
  `ship_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `ship_name` varchar(20) NOT NULL COMMENT '物流公司名称',
  `ship_contact` varchar(20) NOT NULL COMMENT '物流公司联系人',
  `telphone` varchar(20) NOT NULL COMMENT '物流公司联系电话',
  `price` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '配送价格',
  `modified_time` timestamp NOT NULL 
  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`ship_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='物流公司信息表';

6. DB规划

从以下角度考虑:

  • 为以后数据库迁移和拆分提供方便;
  • 避跨库操作,把经常一起关联查询的表放在一个DB中;
  • 为了方便识别表所在的DB,在表名前面增加库名前缀。

6.1 用户数据库(mc_customerdb)

包含:

  • customer_inf
  • customer_login
  • customer_level_inf
  • customer_login_log
  • customer_point_log
  • customer_balance_log

6.2 商品数据库(mc_productdb)

包含:

  • product_info
  • product_pic_info
  • product_category
  • product_supplier_info
  • product_comment
  • product_brand_info

6.3 订单数据库(mc_orderdb)

  • order_master
  • order_detail
  • order_customer_addr
  • warehouse_info
  • shipping_info
  • order_cart
  • warehouse_product

在接下来文章中会在MySQL数据库创建这些数据库。

7.各类规范小结

7.1 数据库命名规范

  • 所有数据库对像名称必须使用小写字母并用下划线分割,MySQL大小写敏感;
  • 所有数据库对像名称禁止使用MySQL保留关键字;
  • 数据库对像的命名要能做到见名识义,尽量不要超过32个字符;
  • 临时库表必须以tmp为前缀,以日期为后缀;
  • 备份库,备份表必须以bak为前缀并,日期为后缀;
  • 所有存储相同数据的列名和列类型必须一致;
  • 所有表尽量使用Innodb存储引擎;
  • 数据库和表的字符集统一使用UTF8(兼容性更好),避免由于字符集转换产生乱码;
  • 所有的表和字段都需要添加注释,使用comment从句添加表和列的备注,从一开始就进行数据字典的维护;
  • 尽量控制单表数据量的大小,建议控制在500万以内,否则修改表结构、备份、恢复都会有很大问题;
  • 谨慎使用MySQL分区表,分区表在物理上表现为多个文件,在逻辑上表现为一个表;
  • 谨慎选择分区键,跨分区查询效率可能更低,建议使用物理分表的方式管理大量数据;
  • 尽量做到冷热数据分离,减小表的宽度,MySQL对行数没有限制,但限制最多存储4096列;
  • 经常一起使用的列放在一个表中;
  • 禁止在表中建立预留字段,预留字段的命名很难做到见名识义,对于预留字段的类型修改会对表进行锁定;
  • 禁止在数据库中存储图片、文件等二进制数据;
  • 禁止在线上做数据库压力测试;
  • 禁止从开发环境、测试环境直连生产环境数据库。

5.6以后的默认引擎支持事务,行级锁,更好的恢复性,高并发下性能更好。可以利用历史数据归档,分库分表来控制数据量大小。

7.2 索引设计规范

  • 限制每张表上的索引列数量,单张表索引尽量不要超过5个;
  • 避免建立冗余索引和重复索引;
  • 禁止给表中的每一列都建立单独的索引;
  • 每个Innodb表必须有一个主键;
  • 不使用更新频繁的列作为主键,不适用多列主键;
  • 不使用UUID、MD5、HASH字符串列作为主键;
  • 主键建议选择使用自增ID值;
  • 对于频繁的查询优先考虑使用覆盖索引,避免Innodb表进行索引的二次查找;
  • 尽量避免使用外键约束(通常是表与表之间的关联键),但一定在表与表之间的关联键上建立索引;
  • 索引可以增加查询效率,但同样也会降低插入和更新的效率。

Innodb是按照主键来组织表的。

面试问题:要在哪些列上建立索引?
答:通常使用SELECT、UPDATE、DELETE语句中的where从句中的列,包含在ORDER BY、GROUP BY、DISTINCT中的字段,多表JOIN的关联列。

面试问题:如何选择索引列的顺序?
答:把区分度最高的列(主键)放在能够在联合索引的最左侧,其实尽量把字段长度小的列放在联合索引的最左侧,使用最频繁的列放到联合索引的左侧。

7.3 数据库字段设计规范

  • 优先选择符合存储需要的最小的数据类型;
  • 避免使用TEXT、BLOB数据类型,若要使用,则把BLOB或TEXT分离到单独的扩展表中;
  • 避免使用ENUM数据类型;
  • 禁止使用数值作为ENUM的枚举值;
  • 尽可能把所有的列定义为NOT NULL;
  • 使用TIMESTAMP或DATETIME类型存储时间;
  • 同财务相关的金额类数据,必须使用decimal类型。

7.4 SQL开发规范

  • 建议使用预编译语句进行数据库操作;
  • 避免数据类型的隐式转换;
  • 程序连接不同的数据库使用不同的账号,禁止跨库查询;
  • 禁止使用不含字段列表的INSERT语句;
  • 避免使用子查询,可以把子查询优化为join操作,子查询的结果集无法使用索引;
  • 避免使用JOIN关联太多的表;
  • 尽量减少与数据库的交互次数;
  • 禁止使用order by rand()进行随机排序;
  • where从句中禁止对列进行函数转换和计算;
  • 在明显不会有重复值是使用union all 而不是union;
  • 拆分复杂的大SQL为多个小SQL。

7.5 操作行为规范

  • 超100万行的批量写操作,要分批多次进行操作;
  • 对于大表使用pt-online-schema-change修改表结构;
  • 禁止为程序使用的账号赋予super权限;
  • 对于程序连接数据库账号,遵循权限最小原则。
大型电商网站全套源码PHP+Mysql 电商网站全套源代码,前台+后台,网银支付+支付宝支付,PHP+MYsql, 商品搜索+购物车+交易信息+商品管理+交易管理+订单管理+地区管理+会员管理+系统管理+商城设置,这里就不一一说明了,字数有限。电商网站该有的都有,数据库免配置,一键安装 立即下载

相关推荐

数据库实训课-图书馆管理系统源代码.rar

包含代码,题目设计,创建表,原始数据输入,视图设计代码,存储过程设计代码,触发器设计代码,答辩PPT等

常见电商项目的数据库表设计(MySQL版)

简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL5.7 图形客户端,SQLyog Linux 模块: 用户:注册、登陆 商品:浏览、管理 订单:生成、管理 仓配:库存、管理 电商实例数据库结构设计 电商项目用户模块 用户表涉及的实体 改进1:第三范式:将依赖传递的列分离出来。比如:登录名<-用户级别<-级别积分上限,...

大唐锦绣的博客 1万+

电商数据库设计.docx

电商数据库设计文档

1.电商项目之MySQL数据库设计

1.准备: ①MYSQL5.7版本 ②MYSQL图形客户端程序,例如:SQLyog、Navicate ③Linux命令,Shell脚本的基础知识 2.项目说明: 3.用户模型设计 ①用户实体 思考:如何把用户的属性存在表中? 第一种:一个表解决 缺点: 数据库设计范式: 第三范式(...

LemonSnm的博客 1530

电子商务系统数据库设计(一)

NULL 博文链接:https://448230305.iteye.com/blog/2070155

网上商城源码+数据库(完全个人设计)

自己之前写的练手的小项目,没地方放了,丢到上面吧。 技术:JSP+Servlet+MYSQL+BootStrap+Html+CSS+Jquery 说明:完全自己设计编写,不是网上其他的抄来抄去的。

java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)

熟悉项目开发过程中SSM框架、JSP、Mysql使用,知道各技术之间的如何衔接; 考虑到部分学生只需要学习前台(买家)或是后台(后台),故将电商系统分为电商系统前台和电商系统后台两个项目, 当前课程包含电商系统前台和电商系统后台 该课程主要涉及到的技术有:  项目涉及的技术:  1、前端:jsp、css、javascript、jQuery(js框架)、bootstrap框架 2、后台:Spring MVC、Spring、Mybatis框架、javaMail进行邮件发送、jstl 、jstl自定义分页标签、代码生成器等 3、数据库:Mysql 4、服务器:Tomcat项目开发涉及的功能: 1、项目以及数据库搭建 2、用户登录、退出3、用户注册、邮件发送、以及用户信息激活4、首页商品信息页面搭建以及查询功能实现5、查询商品明细6、加入商品至购物车、删除、更新、清除购物车商品信息7、确认订单信息8、订单页面搭建以及下订单功能实现9、查询我的购物车以及订单信息10、商品明细查看,商品修改,商品下架11、商品类型管理12、订单管理13、代码机器人使用等等其他实战项目:java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)https://edu.youkuaiyun.com/course/detail/25771 java项目之oa办公管理系统(java毕业设计)https://edu.youkuaiyun.com/course/detail/23008 java项目之hrm人事管理项目(java毕业设计)https://edu.youkuaiyun.com/course/detail/23007 JavaWeb项目实战之点餐系统前台https://edu.youkuaiyun.com/course/detail/20543 JavaWeb项目实战之点餐系统后台https://edu.youkuaiyun.com/course/detail/19572 JavaWeb项目实战之宿舍管理系统(Java毕业设计含源码)https://edu.youkuaiyun.com/course/detail/26721 JavaWeb项目实战之点餐系统全套(前台和后台)https://edu.youkuaiyun.com/course/detail/20610 java项目实战之电子商城后台(java毕业设计SSM框架项目)https://edu.youkuaiyun.com/course/detail/25770 java美妆商城项目|在线购书系统(java毕业设计项目ssm版)https://edu.youkuaiyun.com/course/detail/23989 系统学习课程:JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10https://edu.youkuaiyun.com/course/detail/26941 Java Web从入门到电商项目实战挑战万元高薪(javaweb教程)https://edu.youkuaiyun.com/course/detail/25976其他素材版(毕业设计或课程设计)项目:点击老师头像进行相关课程学习

保姆级教程:手把手教你下载和配置Waymo自动驾驶数据集(附百度网盘链接)

本文提供了一份详细的Waymo自动驾驶数据集下载和配置指南,特别针对国内研究者优化了数据获取方案,包括百度网盘链接和Google Cloud CLI配置。文章还涵盖了环境配置、数据处理实战、可视化分析以及进阶技巧,帮助开发者高效利用这一业界黄金标准数据集进行自动驾驶研究。

weixin_42651281的博客 361

计算机毕业设计SSM电商后台系统【附源码数据库】

项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.

计算机程序源码 1064

完整版:ultralytics下运行yoloworld并训练

本文介绍了Ultralytics YOLO环境的快速配置与使用流程:1) 通过conda创建Python 3.9环境并安装依赖包;2) 配置中科大镜像源加速安装PyTorch和Ultralytics;3) 准备YOLO格式数据集并修改data.yaml配置文件;4) 提供模型预测、训练和验证的常用指令,包括predict/train/val等命令参数设置。文章还包含CLIP模型下载、权重文件获取以及本地安装等注意事项,完整覆盖了从环境搭建到模型部署的全过程。

weixin_50209871的博客 1344

[统计模型] 基于R的潜在剖面分析(LPA)

本文主要介绍基于R进行潜在剖面分析(Latent Profile Aanalysis, LPA)。 关于潜在类别分析LCA/潜在剖面分析LPA的概念和区别,可以参考一下这篇文章: 潜在类别分析LCA \潜在剖面分析LPA介绍https://www.jianshu.com/p/4c830094131e?utm_campaign=maleskine 但是此文对潜类别分析的阐释还比较生涩,而且没有具体的代码编写、模型优选等内容。本文旨在丰富LPA的内容,并希望和大家交流、共同进步。 1. 什么是潜类别分.

bigstar863的博客 1万+

django电商项目源码_分享一个 Python + Django 实现的电商小项目

编辑:业余草来源:https://www.xttblog.com/?p=4944分享一个 Python + Django 实现的电商小项目。如果自学 Python,那么爬虫和电商项目将是你跳不过去的一个坎!今天我分享一个自学 Python 过程中的一个电商练手项目。这个项目五脏齐全,且采用了 Django 框架,也是学习 Python web 项目不可或缺的知识点,所以这个项目实用价值还...

weixin_39982017的博客 1709

STM32低功耗模式下ADC采样抖动的5个隐藏陷阱及解决方案(实测避坑)

本文深入探讨了STM32低功耗模式下ADC采样抖动的5个常见陷阱及解决方案,包括多通道采样电压跃迁、外设开关信号稳定、低功耗模式与ADC时钟同步、输入阻抗失配以及基准电压稳定性问题。通过实测数据和优化代码示例,帮助工程师有效规避ADC采样数据抖动问题,提升物联网设备的测量精度和稳定性。

weixin_30316097的博客 381

电商平台|基于SprinBoot+vue的电商平台设计与实现(源码+数据库+文档)

电商平台可以实现商家管理,商品订单管理,用户管理,商品管理,商品评价管理等功能。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。电商平台可以提高商品交易信息管理问题的解决效率,优化商品交易信息处理流程,保证商品交易信息数据的安全,它是一个非常可靠,非常安全的应用程序。电商平台;Mysql数据库;Java语言。

伟庭的博客 2774

别再问“这游戏啥引擎做的”了,手把手教你用SteamDB一键查询(附实战案例)

本文详细介绍了如何使用SteamDB一键查询游戏引擎信息,包括Unity 3D、Unreal Engine等热门引擎的识别方法。通过实战案例和高级查询技巧,帮助玩家快速获取游戏技术底细,优化游戏体验和兼容性分析。

weixin_31412781的博客 818

Python实战:5分钟搞定高德地图API批量地址转经纬度(附完整代码)

本文提供了一套完整的Python解决方案,利用高德地图Web服务API,实现批量地址到经纬度坐标的自动化转换。文章包含从API申请、核心代码编写到错误处理与性能优化的全流程实战指南,并附赠数据可视化方法,帮助数据分析师和开发者快速提升地理信息处理效率。

weixin_29047919的博客 582

电商|基于java的农业电商系统(源码+数据库+文档)

农业电商服务系统是在实际应用和软件工程的开发,农业电商服务系统是在实际应用和软件工程的开发“农业电商服务系统”是运用java语言和ssm框架,以Mysql数据库为基础而发出来的。首要进行需求分析,分析出农业电商服务系统的主要功能,然后设计了农业电商服务系统结构。整体设计包括农业电商系统的功能、农业电商系统系统总体结构、农业电商系统系统数据结构和对系统安全性进行设计;农业电商系统 java SSM。

伟庭的博客 3550

全志A133的AndroidSDK

本小节来学习如何下载全志安卓SDK,SDK的目录,编译和烧录提示:以下是本篇文章正文内容,下面案例可供参考以上就是整个SDK的目录和编译烧录,目的在于让初学者快速了解整个源码的目录和编译出镜像喜欢就订阅吧。

qq_24093081的博客 4054

分享一个 Python + Django 实现的电商小项目

编辑:业余草来源:https://www.xttblog.com/?p=4944分享一个 Python + Django 实现的电商小项目。如果自学 Python,那么爬虫和电商项目将...

xmt1139057136的专栏 4613

Android 13.0 SystemUI下拉状态栏背景增加高斯模糊背景

在13.0的产品开发中,发现现在很多产品都是高斯模糊背景的,这种高斯模糊背景看起来效果很不错,产品开发需要SystemUI下拉状态栏背景也是高斯模糊背景,所以就要来实现下拉状态栏高斯模糊背景

安卓兼职framework和app工程师的博客 2670

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【课程设计/毕业设计】基于django的数码产品电商平台主数据管理系统基于django的电子产品电商平台主数据管理系统【附源码、数据库、万字文档】

主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。

1076

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【附源码】springboot 电商个性化推荐系统设计与实现

伴随着我国社会的发展,人民生活质量日益提高。于是对电商个性化推荐进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套电商个性化推荐系统,帮助商家进行商品信息、在线沟通等繁琐又重复的工作,提高工作效率的同时,也减轻了管理者的压力。本论文的主要内容包括:第一,研究分析当下主流的web技术,结合电商日常管理方式,进行电商个性化推荐系统的数据库设计,设计电商个性化推荐系统功能,并对每个模块进行说明。

xmw_jx03的博客 1252

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【附源码】springboot 个性化推荐电商平台设计与实现

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了个性化推荐电商的发展。然而,由于用户量和需求量的增加,信息过载等问题暴露出来,为改善传统线下管理中的不足,本文将提出一个性化推荐电商平台,计算机技术作为近十年来新发展起来的科技,可运用于众多领域中,尤其在个性化推荐电商中,可有效地提升其效率。

weixin_53646065的博客 1119

电商|基于java+vue的农业电商系统(源码+数据库+文档)

农业电商服务系统是在实际应用和软件工程的开发,农业电商服务系统是在实际应用和软件工程的开发“农业电商服务系统”是运用java语言和ssm框架,以Mysql数据库为基础而发出来的。首要进行需求分析,分析出农业电商服务系统的主要功能,然后设计了农业电商服务系统结构。整体设计包括农业电商系统的功能、农业电商系统系统总体结构、农业电商系统系统数据结构和对系统安全性进行设计;农业电商系统 java SSM。

伟庭的博客 1292
下一篇: CentOS7环境下MySQL踩坑记
专业逮虾户
博客等级 码龄7年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值