@eugenedrvnk

Разделение ответственности или производительность?

Я создаю приложение. В нем есть юзеры и посты.
Когда создается любой пост в приложении, я должен отправить уведомление администратору о том что создался пост.
Я делаю это так:

class PostService {
  async create(data) {
    const createdPost = await this.prisma.post.create({ // creates post
      title: data.title, 
      text: data.text
      userId: data.userId,
    });
    
    this.notificationService.notify(createdPost); // sends notification
  }
}


Но у меня также есть случай, когда при создании юзера должен создаваться дефолтный пост для этого нового юзера.
И здесь я вижу 2 возможных варианта.
1й:

class UserService {
  create(data) {
    const createdUser = await this.prisma(...); // creates user
    this.postService.create({ // creates post and sends notification
      title: 'default title',
      text: 'default text',
      userId: createdUser.id,
    });
  }
}


Но в этом случае мне придется выполнить 2 запроса к базе данных (создать юзера и создать пост).
Пытаясь делать только один запрос, можно сделать следующее:

class UserService {
  create(data) {
    const created = await this.prisma.user.create({ // create user and post
      name: data.name,
      post: {
        title: 'default title',
        text: 'default text',
      }
    });
    
    this.notificationService.notify(created.post) // sends notification, logic is duplicated
  }
}


Однако, при использовании второго подхода, мне приходится дублировать выполнение "notificationService.notify", и я считаю это недостатком.

Существуют ли возможные решения для этой проблемы?
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Мне кажется, что все прочитали только заголовок, а на текст поста никто не обратил внимания. Как обычно
А там-то и лоснится самый ЖЫР:

Но в этом случае мне придется выполнить 2 запроса к базе данных

То есть вся "проблема" тут из-за каши в голове клиента, который откуда-то взял, что во втором варианте у него будет не два запроса, а один. Ну то есть понятно откуда - очередной разрабончик баз данных, который SQL видел только в кино, а база данных для него - это вот это вот prisma create.

И только из-за этих нелепых страхов он ломает всю логику и сервис юзеров у него начинает лазить в БД постов. Что и является здесь проблемой. А не какие-то, опять же, дурацкие страхи про дублирование вызова нотификации.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@rPman
Дублируй, это не недостаток, а прямое следствие оптимизации
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
А где проблема вообще? Ну будет 2 нотификации. Но они ведь нацеленные на своего потребителя?
Тот кому надо их и прочитает. Или тут экономят сетевой трафик? Короче непонятно.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Вообще-то извещение о созданном посте нужно в случае, когда этот пост надо срочно прочитать или побыстрее промодерировать.

Приветствие новому пользователю, информационное, сгенерированное самой системой, ни читать ни модерировать - не надо. Так зачем извещать об этом расшаркивании ножками администраторов? Что-бы они задолбались читать извещения о приветствиях? Это хоть на грамм повысит скорость обработки постов, да?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы