1

我正在开发一个具有六边形架构的 NodeJS 项目,但我对如何在数据库(MySQL 和 Redis)的实现中管理工作流有很大的疑问

MySQL实现:

  • 我正在使用Sequelize ORM并且可以填充模型以获取关联(JOINs)。Sequelize 实现让我可以在一个模型中设置一些选项,以便将其他模型直接包含在它自己的存储库中。我不需要依赖第二个模型。

Redis 实现:

  • 但是,使用 Redis,我需要单独查询所有资源。这个是正常的。无法关联模型,我必须转到第二个模型的存储库。这些操作应该在我假设的用例中完成。

例子:

MySQL实现顺序

1.1。GetContentsWithVideosUseCase -> 我创建了一个标准来获取所有内容加入它自己的视频

1.2. ContentRepository.findAll(criteriaForJoinVideos) -> 这里我已经有了每个内容及其视频。

1.3. GetContentsWithVideosUseCase -> 我不再需要,所以将它返回给控制器。

Redis 实现顺序

2.1。GetContentsWithVideosUseCase -> 我创建了一个获取所有内容的标准。

2.2. ContentRepository.findAll(criteriaContents) -> 这里我只有每个内容。

2.3. GetContentsWithVideosUseCase -> 我有内容,但现在我需要其中的视频。Contents.map 并按内容为每个视频查询创建标准。

2.4. VideoRepository.findAll(criteriaVideosByContent) -> 这里我已经有一个内容的视频。

2.5. GetContentsWithVideosUseCase -> 我现在拥有所有内容的所有视频,并且我编写了将返回的对象。

问题!

我们可以看到这里的问题是用例应该与实现不同并且不应该发生。

这种情况下的问题是什么是最佳和最正确的做法:

  • 我是否应该独立执行所有 MySQL 查询(在各自的存储库中分隔它们)并留下 JOIN?
  • 是否可以通过 Redis 实现保留 JOIN?
  • 你有没有处理过这个问题?

谢谢!

4

1 回答 1

0

Redis 应该被压缩为一个步骤。应在其存储库中进行所有查询,以检索包含其视频的内容并将其返回到您的域服务。六边形架构假设您的数据库是一个细节,因此您的域服务不关心数据库是否支持关系。您不在乎内部进行了多少查询,直到性能低下,但这是另一回事。

重要说明是存储库应该是每个 AggregateRoot 也不是每个实体。

于 2020-02-07T00:37:38.687 回答