Одиночные запросы или соединения в реализации MySQL (плюс Redis) для шестиугольной архитектуры - PullRequest
0 голосов
/ 22 января 2020

Я разрабатываю проект NodeJS с гексагональной архитектурой, но у меня есть большие сомнения относительно того, как управлять рабочим процессом в реализациях баз данных (MySQL & Redis)

MySQL реализация:

  • Я использую Sequelize ORM , и можно заполнять модели, чтобы получить ассоциации ( JOINs ). Реализация Sequelize позволила мне настроить некоторые параметры в одной модели, чтобы включить другую модель непосредственно в собственный собственный репозиторий . Мне не нужна зависимость от второй модели.

Реализация Redis:

  • Однако в Redis мне нужно запрашивать все ресурсы отдельно . Это нормально. Невозможно связать модели, и мне нужно от go до хранилища второй модели . Эти действия должны быть выполнены в предполагаемом случае использования.

Пример:

MySQL последовательность реализации

1.1. GetContentsWithVideosUseCase -> Я создаю критерии для получения всего содержимого, объединяющего собственные видео

1.2. ContentRepository.findAll (attributeForJoinVideos) -> Здесь у меня уже есть каждый контент с его видео.

1.3. GetContentsWithVideosUseCase -> Мне больше не нужно, поэтому верните его в контроллер.

Последовательность реализации Redis

2.1. GetContentsWithVideosUseCase -> Я создаю критерии для получения всего содержимого.

2.2. ContentRepository.findAll (attributeContents) -> Здесь у меня только каждый контент.

2.3. GetContentsWithVideosUseCase -> У меня есть содержимое, но теперь мне нужны видео из них. Contents.map & создать критерии для каждого запроса видео по содержанию.

2.4. VideoRepository.findAll (attributeVideosByContent) -> Здесь у меня уже есть видео для одного контента.

2.5. GetContentsWithVideosUseCase -> Теперь у меня есть все видео для всего содержимого, и я составляю объект, который будет возвращен.

Вопрос!

Мы видим, что проблема заключается в том, что сценарий использования должен быть различаются в зависимости от реализации, и это не должно происходить.

Вопрос с этим сценарием, какова лучшая и наиболее правильная практика:

  • Должен ли я выполнять все запросы MySQL независимо (разделяя их по соответствующим репозиториям) и оставляя JOINs?
  • Можно ли сохранить JOINs с реализацией Redis?
  • Вы когда-нибудь имели дело с этим?

Спасибо !

1 Ответ

0 голосов
/ 07 февраля 2020

Redis должен быть сжат в один шаг. В его хранилище должны быть сделаны все запросы, необходимые для извлечения контента с его видео и возврата его в ваши доменные службы. Гексагональная архитектура предполагает, что ваш db - это деталь, поэтому ваши доменные службы не заботятся о том, поддерживают ли db отношения или нет. Вам не важно, сколько запросов сделано внутри, пока производительность не будет низкой, но это другая история.

Важно отметить, что репозиторий должен быть скорее для Агрегата Root, ни для сущности.

...