springboot框架Saas系统构建指南(单数据分表设计模式)

概述需求场景

在开发过程,需要将一个原来的系统平台改造成一个SaaS系统,用以给多个不同公司的使用。每个公司拥有自己的员工。在各个公司的用户访问系统时,要求只能看到看到自己公司的数据。例如A公司管理员登录系统,只能看到A公司的用户。B公司管理员登录系统,只能看到B公司的用户。基于此我将此系统平台进行了改造。

实现思路:

通过分表,不同企业用户,实现数据隔离,达到A企业用户访问A公司的表,B企业用户用户访问B用户的表的目的。下面自底向上逐个讲解设计过程

数据库表设计

不同企业用户访问不同的表,那么表名应该进行进行有对于公司的特征码。以查询用户表 sys_user 为例

原始表SQL: select name from sys_user
a公司SQL:  select name from a_sys_user (特征码为a)
b公司SQL:  select name from b_sys_user (特征码为b)

用户表设计

有数据库表设计可知,用户在访问数据库时,在原始的SQL语句上进行亿丢丢的小加工,在原始sql的表名前面加上特征码。那么在用户表在设计时,就得附带上这个特征码。用户表用于记录每个公司下面的人员信息,用户表的特征码存放于company_code属性中,方便后续使用后面使用
用户表设计如下(简易版)

CREATE TABLE `sys_user`  (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID',
  `login_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号',
  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户昵称',
  `company_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '公司编号',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;

分表实现方式一(参数传递方式)

a公司用户登录系统后,进行数据库curd时,可以将当前用户的特征码作为参数传入,在mybaties框架下,改写xml文件中的sql。以插入新用户为例,sql如下

我们使用mybaties的$符号获取传递过来的特征码。那么我们只需要在每个sql的表名称前面带上特征码。
此例中通过${companyCode}获得用户特征码
<insert id="insertUserRegister" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
		insert into ${companyCode}_sys_user(
		<if test="userId != null and userId != 0">user_id,</if>
		<if test="deptId != null and deptId != 0">dept_id,</if>
		<if test="loginName != null and loginName != ''">login_name,</if>
		<if test="userName != null and userName != ''">user_name,</if>
	    <if test="companyCode != null">company_code,</if>
		create_time
		)values(
		<if test="userId != null and userId != ''">#{userId},
		<if test="deptId != null and deptId != ''">#{deptId},
		<if test="loginName != null and loginName != ''">#{loginName},
		<if test="userName != null and userName != ''">#{userName},>
		<if test="companyCode != null">#{companyCode},
		sysdate()
		)
	</insert>

分表实现方式二(mybaties全局拦截器)

未完待续…有空在更吧,写了差不多一半了,想了解更多可以私信我

你可能感兴趣的:(spring,boot,设计模式,数据库)