区块链技术博客
www.b2bchain.cn

SpringCloud-Alibaba微服务架构实战教程—03数据库设计求职学习资料

本文介绍了SpringCloud-Alibaba微服务架构实战教程—03数据库设计求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

继前一篇文章,我们对业务需求进行了大致的分析,在加上绘制了基本的业务模型,从而根据业务层次,把 景停系统 划分为了七大模块。

本篇开始之前,想问问大家,系统拆分为不同的微服务之后,那么存储用的数据库是否也有必要拆分吗?

答案是有必要的。

目前仍然有很多微服务团队,在开发时候,往往只是将服务拆分,存储仍共用一份数据库。这样做是不好的,因为微服务得以发展的原因之一就是解耦。

因此,在实施微服务架构时,我们通常建议遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合,这样某个服务的数据库发生改变不影响其它服务。

数据库的规范设计

上过软件工程的同学都知道,按照规范设计的方法论,将数据库设计通常分为以下6个阶段:

  1. 业务需求分析阶段
  2. 概念结构设计阶段
  3. 逻辑结构设计阶段
  4. 物理结构设计阶段
  5. 数据库实施阶段
  6. 数据库运行及维护阶段

其中的,第一阶段,需求分析我们在前一章已经处理。关于后面阶段,由于篇幅有限,我们就主要讨论其中的第二,三阶段,即概念和逻辑设计。

在概念结构设计阶段,主要就是采用E-R模型进行设计,画出E-R图。在逻辑结构设计阶段,主要就是通过将E-R图转换成实体表,实现从E-R模型到关系模型的转换。

PowerDisigner建立数据库模型

数据库建模,通常我们采用PowerDesigner工具,它是UML对象模型的建模工具,用来构建数据模型以及实体、属性的关系,最后生成数据库脚本语句。

依据上一章的业务分析,我们将系统拆分为7个子模块,又依据微服务架构建议,将每个模块对应一个数据库,数据存储隔离在7个数据库中,分别为:

  • car_member——用户库,包含用户表,会员卡表,用户车辆表。
  • car_resource——资源库,闸机表,车位表,车位使用记录表。
  • car_record——记录库,计费规则表,车辆入场记录表,车辆出场记录表。
  • car_finance——财务库,停车费的支付流水表,会员的月卡充值表。
  • car_message——消息库。推送消息记录表。代表一些营销记录。
  • car_carwash——消费库。洗车记录表,代表一些消费行为记录。
  • car_points——积分库,积分兑换表,用户积分表,用户签到表。

所以接下来,我们就打开PowerDesigner工具,点击文件>>新建模型>>>选择Physical Data,修改模型名称和数据库类型。
如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

建模示例

在新建模型之后,在模型的基础上右键,点击新增table,新增出对应的表名。

因为我们总共有7个微服务数据库,我们就以上述同样的方法建立7个模型,和对应的表。
最终效果如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

数据库模型示例

使用PowerDesigner设计好数据库模型,这样的好处是方便对数据库设计进行管理,并且能够便捷的查看表与表之间的关系,最后我们还可以利用它生成对应的SQL脚本执行。

数据库设计

当然,上诉这些都是开发的规范流程,由于篇幅有限,我就不做具体描述。关于PowerDesigner的使用,参考文末资料。

在这里就直接提供大家设计后的SQL脚本,在对应的mysql数据库中执行即可:

1.建库语句:

可以在数据库管理工具中执行,比如笔者使用的是Navicat软件。

CREATE DATABASE `car_member` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_points` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_finance` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_resource` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_message` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_carwash` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_record` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

顺便提及一下,笔者当时使用的是mysql8.0版本,如果你用的是5.7以下版本,请把句中utf8mb4 一键替换为utf8再执行。

2.建表语句

使用Navicat软件执行完上面之后会生成7个数据库,再进入到对应的数据库中去执行下面的sql。

car_member 库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `member_user`; CREATE TABLE `member_user` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '用户编号',   `phone` varchar(11) DEFAULT NULL COMMENT '手机号',   `birth` varchar(10) DEFAULT NULL COMMENT '生日',   `real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态是否会员0否1是',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户/会员信息表';  DROP TABLE IF EXISTS `member_card`; CREATE TABLE `member_card` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '卡id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_num` varchar(20) DEFAULT NULL COMMENT '会员卡号',   `start` varchar(16) DEFAULT NULL COMMENT '有效期起始',   `ends` varchar(16) DEFAULT NULL COMMENT '有效期截止',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡表';  CREATE TABLE `member_vehicle` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '车辆id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `vehicle_info` varchar(50) DEFAULT NULL COMMENT '车辆型号',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int DEFAULT '0' COMMENT '版本号',   `state` int DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆信息表';

car_points库表结构初始化:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `points_exchange`; CREATE TABLE `points_exchange` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '兑换记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_qty` int(11) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0优惠券,1洗车券',   `coupon_code` varchar(30) DEFAULT NULL COMMENT '券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分兑换表';  DROP TABLE IF EXISTS `points_info`; CREATE TABLE `points_info` (   `id` varchar(11) NOT NULL DEFAULT '' COMMENT '积分id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cur_qty` varchar(20) DEFAULT NULL COMMENT '当前可用积分',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分表';  DROP TABLE IF EXISTS `points_sign`; CREATE TABLE `points_sign` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '签到记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cnt` int(4) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0签到,1消费',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户签到表';

car_catwash库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `wash_record`; CREATE TABLE `wash_record` (   `id` varchar(32) NOT NULL COMMENT '洗车id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `coupon_code` varchar(20) DEFAULT NULL COMMENT '洗车券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

car_finance库初始化表结构:

前言

继前一篇文章,我们对业务需求进行了大致的分析,在加上绘制了基本的业务模型,从而根据业务层次,把 景停系统 划分为了七大模块。

本篇开始之前,想问问大家,系统拆分为不同的微服务之后,那么存储用的数据库是否也有必要拆分吗?

答案是有必要的。

目前仍然有很多微服务团队,在开发时候,往往只是将服务拆分,存储仍共用一份数据库。这样做是不好的,因为微服务得以发展的原因之一就是解耦。

因此,在实施微服务架构时,我们通常建议遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合,这样某个服务的数据库发生改变不影响其它服务。

数据库的规范设计

上过软件工程的同学都知道,按照规范设计的方法论,将数据库设计通常分为以下6个阶段:

  1. 业务需求分析阶段
  2. 概念结构设计阶段
  3. 逻辑结构设计阶段
  4. 物理结构设计阶段
  5. 数据库实施阶段
  6. 数据库运行及维护阶段

其中的,第一阶段,需求分析我们在前一章已经处理。关于后面阶段,由于篇幅有限,我们就主要讨论其中的第二,三阶段,即概念和逻辑设计。

在概念结构设计阶段,主要就是采用E-R模型进行设计,画出E-R图。在逻辑结构设计阶段,主要就是通过将E-R图转换成实体表,实现从E-R模型到关系模型的转换。

PowerDisigner建立数据库模型

数据库建模,通常我们采用PowerDesigner工具,它是UML对象模型的建模工具,用来构建数据模型以及实体、属性的关系,最后生成数据库脚本语句。

依据上一章的业务分析,我们将系统拆分为7个子模块,又依据微服务架构建议,将每个模块对应一个数据库,数据存储隔离在7个数据库中,分别为:

  • car_member——用户库,包含用户表,会员卡表,用户车辆表。
  • car_resource——资源库,闸机表,车位表,车位使用记录表。
  • car_record——记录库,计费规则表,车辆入场记录表,车辆出场记录表。
  • car_finance——财务库,停车费的支付流水表,会员的月卡充值表。
  • car_message——消息库。推送消息记录表。代表一些营销记录。
  • car_carwash——消费库。洗车记录表,代表一些消费行为记录。
  • car_points——积分库,积分兑换表,用户积分表,用户签到表。

所以接下来,我们就打开PowerDesigner工具,点击文件>>新建模型>>>选择Physical Data,修改模型名称和数据库类型。
如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

建模示例

在新建模型之后,在模型的基础上右键,点击新增table,新增出对应的表名。

因为我们总共有7个微服务数据库,我们就以上述同样的方法建立7个模型,和对应的表。
最终效果如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

数据库模型示例

使用PowerDesigner设计好数据库模型,这样的好处是方便对数据库设计进行管理,并且能够便捷的查看表与表之间的关系,最后我们还可以利用它生成对应的SQL脚本执行。

数据库设计

当然,上诉这些都是开发的规范流程,由于篇幅有限,我就不做具体描述。关于PowerDesigner的使用,参考文末资料。

在这里就直接提供大家设计后的SQL脚本,在对应的mysql数据库中执行即可:

1.建库语句:

可以在数据库管理工具中执行,比如笔者使用的是Navicat软件。

CREATE DATABASE `car_member` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_points` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_finance` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_resource` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_message` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_carwash` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_record` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

顺便提及一下,笔者当时使用的是mysql8.0版本,如果你用的是5.7以下版本,请把句中utf8mb4 一键替换为utf8再执行。

2.建表语句

使用Navicat软件执行完上面之后会生成7个数据库,再进入到对应的数据库中去执行下面的sql。

car_member 库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `member_user`; CREATE TABLE `member_user` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '用户编号',   `phone` varchar(11) DEFAULT NULL COMMENT '手机号',   `birth` varchar(10) DEFAULT NULL COMMENT '生日',   `real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态是否会员0否1是',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户/会员信息表';  DROP TABLE IF EXISTS `member_card`; CREATE TABLE `member_card` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '卡id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_num` varchar(20) DEFAULT NULL COMMENT '会员卡号',   `start` varchar(16) DEFAULT NULL COMMENT '有效期起始',   `ends` varchar(16) DEFAULT NULL COMMENT '有效期截止',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡表';  CREATE TABLE `member_vehicle` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '车辆id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `vehicle_info` varchar(50) DEFAULT NULL COMMENT '车辆型号',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int DEFAULT '0' COMMENT '版本号',   `state` int DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆信息表';

car_points库表结构初始化:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `points_exchange`; CREATE TABLE `points_exchange` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '兑换记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_qty` int(11) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0优惠券,1洗车券',   `coupon_code` varchar(30) DEFAULT NULL COMMENT '券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分兑换表';  DROP TABLE IF EXISTS `points_info`; CREATE TABLE `points_info` (   `id` varchar(11) NOT NULL DEFAULT '' COMMENT '积分id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cur_qty` varchar(20) DEFAULT NULL COMMENT '当前可用积分',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分表';  DROP TABLE IF EXISTS `points_sign`; CREATE TABLE `points_sign` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '签到记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cnt` int(4) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0签到,1消费',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户签到表';

car_catwash库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `wash_record`; CREATE TABLE `wash_record` (   `id` varchar(32) NOT NULL COMMENT '洗车id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `coupon_code` varchar(20) DEFAULT NULL COMMENT '洗车券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

car_finance库初始化表结构:

前言

继前一篇文章,我们对业务需求进行了大致的分析,在加上绘制了基本的业务模型,从而根据业务层次,把 景停系统 划分为了七大模块。

本篇开始之前,想问问大家,系统拆分为不同的微服务之后,那么存储用的数据库是否也有必要拆分吗?

答案是有必要的。

目前仍然有很多微服务团队,在开发时候,往往只是将服务拆分,存储仍共用一份数据库。这样做是不好的,因为微服务得以发展的原因之一就是解耦。

因此,在实施微服务架构时,我们通常建议遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合,这样某个服务的数据库发生改变不影响其它服务。

数据库的规范设计

上过软件工程的同学都知道,按照规范设计的方法论,将数据库设计通常分为以下6个阶段:

  1. 业务需求分析阶段
  2. 概念结构设计阶段
  3. 逻辑结构设计阶段
  4. 物理结构设计阶段
  5. 数据库实施阶段
  6. 数据库运行及维护阶段

其中的,第一阶段,需求分析我们在前一章已经处理。关于后面阶段,由于篇幅有限,我们就主要讨论其中的第二,三阶段,即概念和逻辑设计。

在概念结构设计阶段,主要就是采用E-R模型进行设计,画出E-R图。在逻辑结构设计阶段,主要就是通过将E-R图转换成实体表,实现从E-R模型到关系模型的转换。

PowerDisigner建立数据库模型

数据库建模,通常我们采用PowerDesigner工具,它是UML对象模型的建模工具,用来构建数据模型以及实体、属性的关系,最后生成数据库脚本语句。

依据上一章的业务分析,我们将系统拆分为7个子模块,又依据微服务架构建议,将每个模块对应一个数据库,数据存储隔离在7个数据库中,分别为:

  • car_member——用户库,包含用户表,会员卡表,用户车辆表。
  • car_resource——资源库,闸机表,车位表,车位使用记录表。
  • car_record——记录库,计费规则表,车辆入场记录表,车辆出场记录表。
  • car_finance——财务库,停车费的支付流水表,会员的月卡充值表。
  • car_message——消息库。推送消息记录表。代表一些营销记录。
  • car_carwash——消费库。洗车记录表,代表一些消费行为记录。
  • car_points——积分库,积分兑换表,用户积分表,用户签到表。

所以接下来,我们就打开PowerDesigner工具,点击文件>>新建模型>>>选择Physical Data,修改模型名称和数据库类型。
如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

建模示例

在新建模型之后,在模型的基础上右键,点击新增table,新增出对应的表名。

因为我们总共有7个微服务数据库,我们就以上述同样的方法建立7个模型,和对应的表。
最终效果如图:
SpringCloud-Alibaba微服务架构实战教程—03数据库设计

数据库模型示例

使用PowerDesigner设计好数据库模型,这样的好处是方便对数据库设计进行管理,并且能够便捷的查看表与表之间的关系,最后我们还可以利用它生成对应的SQL脚本执行。

数据库设计

当然,上诉这些都是开发的规范流程,由于篇幅有限,我就不做具体描述。关于PowerDesigner的使用,参考文末资料。

在这里就直接提供大家设计后的SQL脚本,在对应的mysql数据库中执行即可:

1.建库语句:

可以在数据库管理工具中执行,比如笔者使用的是Navicat软件。

CREATE DATABASE `car_member` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_points` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_finance` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_resource` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_message` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_carwash` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE `car_record` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

顺便提及一下,笔者当时使用的是mysql8.0版本,如果你用的是5.7以下版本,请把句中utf8mb4 一键替换为utf8再执行。

2.建表语句

使用Navicat软件执行完上面之后会生成7个数据库,再进入到对应的数据库中去执行下面的sql。

car_member 库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `member_user`; CREATE TABLE `member_user` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '用户编号',   `phone` varchar(11) DEFAULT NULL COMMENT '手机号',   `birth` varchar(10) DEFAULT NULL COMMENT '生日',   `real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态是否会员0否1是',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户/会员信息表';  DROP TABLE IF EXISTS `member_card`; CREATE TABLE `member_card` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '卡id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_num` varchar(20) DEFAULT NULL COMMENT '会员卡号',   `start` varchar(16) DEFAULT NULL COMMENT '有效期起始',   `ends` varchar(16) DEFAULT NULL COMMENT '有效期截止',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡表';  CREATE TABLE `member_vehicle` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '车辆id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `vehicle_info` varchar(50) DEFAULT NULL COMMENT '车辆型号',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int DEFAULT '0' COMMENT '版本号',   `state` int DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆信息表';

car_points库表结构初始化:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `points_exchange`; CREATE TABLE `points_exchange` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '兑换记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `card_qty` int(11) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0优惠券,1洗车券',   `coupon_code` varchar(30) DEFAULT NULL COMMENT '券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分兑换表';  DROP TABLE IF EXISTS `points_info`; CREATE TABLE `points_info` (   `id` varchar(11) NOT NULL DEFAULT '' COMMENT '积分id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cur_qty` varchar(20) DEFAULT NULL COMMENT '当前可用积分',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分表';  DROP TABLE IF EXISTS `points_sign`; CREATE TABLE `points_sign` (   `id` varchar(32) NOT NULL DEFAULT '' COMMENT '签到记录id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `cnt` int(4) DEFAULT NULL COMMENT '积分数量',   `ctype` int(4) DEFAULT NULL COMMENT '0签到,1消费',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户签到表';

car_catwash库初始化表结构:

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  DROP TABLE IF EXISTS `wash_record`; CREATE TABLE `wash_record` (   `id` varchar(32) NOT NULL COMMENT '洗车id',   `member_id` varchar(32) DEFAULT NULL COMMENT '用户编号',   `plate_num` varchar(10) DEFAULT NULL COMMENT '车牌号',   `coupon_code` varchar(20) DEFAULT NULL COMMENT '洗车券编码',   `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',   `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',   `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',   `remark` varchar(500) DEFAULT NULL COMMENT '备注',   `version` int(4) DEFAULT '0' COMMENT '版本号',   `state` int(4) DEFAULT '1' COMMENT '状态',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

car_finance库初始化表结构:

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » SpringCloud-Alibaba微服务架构实战教程—03数据库设计求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们