Spring Boot项目开发实战销售管理系统——数据库设计!
数据库设计
基于以上的系统设计和需求分析进行数据库设计。数据库设计是将应用涉及的数据实体与这些数据实体之间的关系进行规划和结构化的过程。数据库设计分以下几个步骤:
(1)收集信息。创建数据库之前,必须充分理解项目的需求,了解数据库需要存储哪些数据、实现哪些功能。
(2)设计数据库的表实体。收集信息后,标识数据库要管理的关键对象或数据库表实体。
(3)设计每个表需要存储的详细信息。数据库中的主要表实体标示为表以后,就要设计每个表存储的详细信息,也称为表的属性,这些属性将组成表中的字段。
(4)标识实体之间的关系。关系型数据库的一个强大功能是可以关联数据库中各个项目的相关信息。在设计过程中,要标识实体之间的关系,首先需要分析数据库的表,确定这些表在逻辑上是如何关联的,然后添加关系列,建立起表之间的连接。
数据库的设计至关重要,数据库中表的设计直接决定了业务代码的编写以及数据的存储。
数据库概念模型设计
根据以上项目的需求分析,设计概念模型的主要特点:
能真实、充分地反映现实世界,包括事物之间的联系,能满足用户对数据的处理要求,是现实世界的一个真实模型。
易于理解,可以用它和不熟悉计算机的用户进行意见交换。用户的积极参与是数据库成功设计的关键。易于更改,当应用环境和应用要求改变时容易对概念模型进行修改和扩充。
易于向关系、网状和层次等各种数据模型转换。
概念模型是各种数据模型的共同基础,它比数据模型更独立于机器,也更抽象,从而更加稳定。描述概念模型的有力工具是E-R模型(即E-R图,Entity-Relationship,也称为实体-关系图,用于和项目团队中的其他成员及客户沟通,讨论数据库设计能否满足客户的业务需求和数据处理需求,主要由一些含有特殊含义的图形符号构成)。
E-R模型有以下4个概念:
实体:指现实世界中具有区分其他事物的特征或属性并与其他事物有联系的事物。实体一般是名词,对应表中的一行数据,用矩形表示。
属性:实体特征,对应表中的列,用椭圆形表示,一般也是名词。
联系:指两个或多个实体之间的关系,用菱形表示,一般是动词。
映射基数:表示通过联系与该实体关联的其他实体的个数。
在E-R模型中,实体集X与Y之间的关系有4种,分别是一对一、一对多、多对一、多对多,具体介绍如下:
一对一:X中的一个实体最多与Y中的一个实体关联,并且Y中的一个实体最多与X中的一个实体关联。
一对多:X中的一个实体可以与Y中的任意数量的实体关联,Y中的一个实体最多与X中的一个实体关联。
多对一:X中的一个实体最多与Y中的一个实体关联,Y中的一个实体可以与X中任意数量的实体关联。
多对多:X中的一个实体可以与Y中的任意数量的实体关联,Y中的一个实体可以与X中任意数量的实体关联。
本项目数据库需要用户表、客户表、客户跟进表、产品表、订单表、订单详情表、订单目标表和待办事项表。各个表之间有以下的关系:一个用户可以创建多个客户;用户在一个客户的基础上可以创建多个客户的跟进记录;一个用户可以创建多个产品;一个用户可以再选择一个客户创建多个订单;一个订单有一个或者多个订单详情;一个用户至少有一个订单目标;一个用户没有或者有多个待办事项。
综上所述,本系统有8张表,参见表9.1。
表9.1 设计数据库中的表
各数据库的字段如下:
客户表中的字段为主键、名称和公司地址;
客户跟进表中的字段为主键、客户id、用户id和跟进时间;
订单表中的字段为主键、订单时间和订单总额;
订单详情表中的字段为主键、订单id、产品id和产品价格;
订单目标表中的字段为主键、用户id和目标值;
待办事项表中的字段为主键、用户id、待办事项和办事时间;
产品表中的字段为主键、产品名和创建者;
用户表中的字段为主键、用户名和密码。
根据数据关系建立数据库表的E-R图,如图9.4所示。
根据以上E-R图可知,一个客户对应0个或者n个订单,一个客户对应0个或者n个客户,一个订单对应n个订单详情,一个用户对应0个或者n个客户,一个客户对应0个或者n个客户跟进记录,一个用户对应0个或者n个产品,一个用户对应0个或者n个待办事项,一个客户对应一个订单目标。
数据库逻辑结构设计
根据E-R图中的关系创建数据库表之间的结构设计,如图9.5所示。
图9.5 数据库表的结构设计
下面介绍各个表的详细设计。
(1)用户表user的字段如表9.2所示。
表9.2 user表的字段
(2)客户表customer的字段如表9.3所示。
表9.3 customer表的字段
(3)跟进记录表customer_follow的字段如表9.4所示。
表9.4 customer_follow表的字段
(4)产品表product的字段如表9.5所示。
表9.5 product表的字段
(5)订单表order的字段如表9.6所示。
表9.6 order表的字段
(6)订单详情表order_detail的字段如表9.7所示。
表9.7 order_detail表的字段
(7)订单目标表order_target的字段如表9.8所示。
表9.8 order_target表的字段
(8)待办事项表to_do_list表的字段参见表9.9。
表9.9 to_do_list表的字段
以上完成了所有的数据库设计,数据库设计要适度,既要考虑当前的功能需要,也要考虑未来可能出现的扩展,还要考虑可能会出现的海量数据问题,不应该过度设计,适合当前的项目最重要。下面根据数据库的设计创建具体的数据库的表。
创建数据表
根据以上的数据库设计,在MySQL中编写数据库表的客户表,SQL语句如下:
CREATE TABLE `customer` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(20) DEFAULT NULL COMMENT '名字',
`company_address` varchar(255) DEFAULT NULL COMMENT '公司地址',
`person` varchar(20) DEFAULT NULL COMMENT '联系人',
`phone` varchar(11) DEFAULT NULL COMMENT '手机',
`profession` varchar(20) DEFAULT NULL COMMENT '行业',
`province` varchar(10) DEFAULT NULL COMMENT '省份',
`city` varchar(10) DEFAULT NULL COMMENT '城市',
`user_id` bigint(20) DEFAULT NULL COMMENT '负责人id',
`customer_state` int(11) DEFAULT NULL COMMENT '客户状态:0表示新建完成 1
表示跟进中 2表示即将成交 3表示成交过的',
`competitor` varchar(255) DEFAULT NULL COMMENT '竞争对手',
`note` varchar(1000) DEFAULT NULL COMMENT '客户备注',
`bank_name` varchar(255) DEFAULT NULL COMMENT '开户行',
`bank_no` varchar(255) DEFAULT NULL COMMENT '开户账号',
`bill_address` varchar(400) DEFAULT NULL COMMENT '发票地址',
`bill_person` varchar(20) DEFAULT NULL COMMENT '发票人',
`bill_phone` varchar(20) DEFAULT NULL COMMENT '发票手机号',
`bill_note` varchar(500) DEFAULT NULL COMMENT '开票备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='客户
表';
客户跟进表的代码如下:
CREATE TABLE `customer_follow` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`customer_id` bigint(20) DEFAULT NULL COMMENT '跟进客户id',
`user_id` bigint(20) DEFAULT NULL COMMENT '创建用户id',
`create_time` datetime DEFAULT NULL COMMENT '跟进时间',
`subject` varchar(255) DEFAULT NULL COMMENT '主题',
`content` varchar(255) DEFAULT NULL COMMENT '跟进内容',
`next_time` date DEFAULT NULL COMMENT '下次跟进时间',
`next_content` varchar(255) DEFAULT NULL COMMENT '下次跟进内容',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='客户跟
进表';订单表的代码如下:
CREATE TABLE `order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned DEFAULT NULL COMMENT '创建用户id',
`customer_id` bigint(20) unsigned DEFAULT NULL COMMENT '客户id',
`create_date` datetime DEFAULT NULL COMMENT '创建日期',
`total_money` decimal(10,2) DEFAULT NULL COMMENT '总金额',
`already_pay` decimal(10,2) DEFAULT NULL COMMENT '已经支付的钱数',
`next_pay_time` date DEFAULT NULL COMMENT '下次支付时间',
`discount` decimal(10,2) DEFAULT NULL COMMENT '回扣',
`product_state` tinyint(2) unsigned DEFAULT NULL COMMENT '0表示未发货
1表示发货了部分产品 2表示全部发货完成',
`pay_state` tinyint(2) unsigned DEFAULT NULL COMMENT '订单支付状态: 0
表示未支付 1表示支付部分 2表示支付完成',
`send_time` date DEFAULT NULL COMMENT '发货时间',
`send_address` varchar(200) DEFAULT NULL COMMENT '地址',
`send_price` decimal(10,2) DEFAULT NULL COMMENT '运费',
`send_way` varchar(255) DEFAULT NULL COMMENT '发货方式',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='订单
表';
订单详情表的代码如下:
CREATE TABLE `order_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`order_id` bigint(20) DEFAULT NULL COMMENT '订单id',
`product_id` bigint(20) DEFAULT NULL COMMENT '产品id',
`product_code` varchar(20) DEFAULT NULL COMMENT '产品编码',
`product_name` varchar(255) DEFAULT NULL COMMENT '产品名称',
`amount` int(11) unsigned DEFAULT NULL COMMENT '数量',
`univalent` decimal(10,2) DEFAULT NULL COMMENT '单价',
`total_price` decimal(10,2) DEFAULT NULL COMMENT '总价',
PRIMARY KEY (`id`) USING BTREE,
KEY `index_order_product_id` (`order_id`,`product_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='订单明
细
order_detail';
订单目标表的代码如下:
CREATE TABLE `order_target` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`start_time` date DEFAULT NULL COMMENT '目标开始时间',
`end_time` date DEFAULT NULL COMMENT '目标结束时间',
`target` varchar(100) DEFAULT NULL COMMENT '目标',
`has_done` varchar(100) DEFAULT NULL COMMENT '已经完成',
`target_state` tinyint(1) DEFAULT NULL COMMENT '目标状态:0表示未完成 1
表示已经完成',
`user_id` bigint(20) unsigned NOT NULL COMMENT '关联到的用户
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='目标
记录';
产品表的代码如下:
CREATE TABLE `product` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '名字',
`code` varchar(20) DEFAULT NULL COMMENT '产品编码',
`create_time` date DEFAULT NULL COMMENT '创建时间',
`supplier` varchar(100) DEFAULT NULL COMMENT '供应商',
`note` varchar(200) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
COMMENT '备注',
`product_unit` varchar(20) DEFAULT NULL COMMENT '产品单位',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='产品
表';待办事项表的代码如下:
CREATE TABLE `to_do_list` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL COMMENT '创建者的用户id',
`content` varchar(300) DEFAULT NULL COMMENT '待办事项内容',
`create_time` varchar(30) DEFAULT NULL COMMENT '创建日期',
`do_time` varchar(30) DEFAULT NULL COMMENT '计划完成时间',
`work_state` tinyint(1) DEFAULT NULL COMMENT '任务状态:0表示未完成, 1表
示已完成',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='待办事
项表';
用户表的代码如下:
CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`password` varchar(50) DEFAULT NULL COMMENT '密码',
`name` varchar(50) DEFAULT NULL COMMENT '名字',
`age` int(11) unsigned DEFAULT NULL COMMENT '年龄',
`phone` char(11) DEFAULT NULL COMMENT '手机号',
`role` tinyint(1) unsigned DEFAULT NULL COMMENT '身份:1表示普通用户 0
表示管理员',
`user_state` int(11) DEFAULT NULL COMMENT '当前用户状态:0表示正常 1表示
限制登录 2表示已经被删除的用户',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户
表';
在数据库的客户端执行上述SQL语句完成表的创建。建议读者在完成了数据库的表设计和创建后,使用IDEA直接生成数据库对应的实体类,而不需要自己按照数据库的表字段一个一个地建立实体类。步骤如下;
(1)连接本地MySQL数据库,如图9.6所示。
(2)填写连接信息,连接成功后打开数据库,选中一张表后右击,在弹出的快捷菜单中可选择generate java class命令,即可生成该表对应的实体类,如图9.7所示。