mysql - 六边形架构的 MySQL(加上 Redis)上的单查询或 JOIN 实现

标签 mysql redis sequelize.js domain-driven-design hexagonal-architecture

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

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

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

  • 例子:
    MySQL实现顺序

    1.1. GetContentsWithVideosUseCase -> I create a Criteria for get all Contents joining its own Videos

    1.2. ContentRepository.findAll(criteriaForJoinVideos) -> Here I already have each content with its videos.

    1.3. GetContentsWithVideosUseCase -> I doesn't need anymore so return it to controller.


    Redis实现顺序

    2.1. GetContentsWithVideosUseCase -> I create a Criteria for get all Contents.

    2.2. ContentRepository.findAll(criteriaContents) -> Here I only have each content.

    2.3. GetContentsWithVideosUseCase -> I have contents but now I need videos from them. Contents.map & create criteria for each query of videos by content.

    2.4. VideoRepository.findAll(criteriaVideosByContent) -> Here I already have videos for one content.

    2.5. GetContentsWithVideosUseCase -> I have now all videos for all contents & I compose the object which will be returned.


    问题!
    我们可以看到这里的问题是用例应该因实现而异,而这不应该发生。
    这种情况下的问题是什么是最佳和最正确的做法:
  • 我是否应该独立执行所有 MySQL 查询(将它们分开在各自的存储库中)并离开 JOIN?
  • 是否可以将 JOIN 与 Redis 实现保持一致?
  • 你处理过这个吗?

  • 谢谢!

    最佳答案

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

    重要的一点是存储库应该是每个 AggregateRoot 或每个实体。

    关于mysql - 六边形架构的 MySQL(加上 Redis)上的单查询或 JOIN 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858031/

    相关文章:

    javascript - Node.js 为相关查询提供空数组

    php - 从 mysql 检索到的 json 字符串上的 json_decode 不起作用

    php - 如何在 BitBucket 管道中设置 mysqli

    node.js - Sequelize 表未与用户关联

    model - 使用 OR 条件设置 Sequelize.js 关联

    mysql - 无法添加或更新子行 : a foreign key constraint fails - Ruby on Rails

    python - 在Django中使用Redis同步请求

    c# - 如何在 C# 中从 Redis 数据库获取、更新所有键及其值?

    spring-boot - LettuceConnectionFactory对redis和springboot是否有版本限制?

    generics - 是否可以在 typescript 中导入通用 promise ?