lihongjie0209 / myblog

4 stars 0 forks source link

关于CQRS的思考 #10

Open lihongjie0209 opened 4 years ago

lihongjie0209 commented 4 years ago

普通的应用

image

读写通常发生在具体的某一张表中.

在实际情况中, 我们通常会遇到一下的问题:

  1. 数据库不同表的读写压力是不同的.
  2. 写入模型与读取(展示)模型存在差异.

最简单的例子就是按照关系型数据库的范式设计, 我们在写入的时候通常只需要存储关联表的ID, 但是展示的时候需要关联表的额外信息.

我们的写入是单表操作, 但是查询通常需要表连接, 这样就导致了数据库的读写压力不同. 同时我们读写所操作的对象是不同的.

lihongjie0209 commented 4 years ago

建立不同的模型

为了解决这类型的问题, 我们通常是建立不同的模型去操作数据库, 比如说写一个复杂SQL然后用自定义的JavaBean来做映射, 这个JavaBean与写入的JavaBean是不同的.

class Log{
   int id;
   int userId;

}
class LogForRead{
   int id;
   int userId;
  String username;

}
lihongjie0209 commented 4 years ago

实现1: 自定义SQL

最最最简单的实现了, 我们写一段自定的SQL专门为了查询优化, 最后使用MyBatis之类的工具映射到JavaBean.

优点: 实现简单 缺点: 没有解决读写压力不同的问题.

lihongjie0209 commented 4 years ago

实现2: 数据库读写分离

image

优点: 不需要改代码, 实现1切换一下数据源就可以了 缺点: 需要考虑数据同步的问题

lihongjie0209 commented 4 years ago

实现3: 异构数据库+异构数据模型

当我们的查询太过复杂, 关系型数据已经无法满足我们的需求的时候, 我们可以考虑使用非关系型数据库, 同时由于非关系型数据库是基于文档存储的, 我们的查询对象可以不再局限于关系型数据库的二维结构.

优点: 查询性能更好 缺点: 需要改代码, 需要考虑异步数据库的同步问题

lihongjie0209 commented 4 years ago

选择

简单应用使用实现1 性能不足使用实现2 还是无法满足使用实现3

这三种方案是演进式, 如果没有必要不要上复杂的实现. 同时这三种方案是可以共存的, 没必要把后台管理的一些简单功能放到异构数据库中