Как я могу разбить объединенные результаты на 2 источника данных

Я работаю в системе службы поддержки с двумя важными объектами: билетами и электронными письмами.

Билеты хранятся в домашней системе билетов. Каждый билет исходит от клиента и имеет (среди прочих полей) сводное поле. Клиент может быть компанией с несколькими сотрудниками с разными адресами электронной почты.

В настоящее время мы работаем над подключением системы заявок к нашей системе электронной почты. Пользователи могут связать электронную почту с заявкой. Каждое письмо имеет дополнительную ссылку на тикет. Несколько электронных писем могут ссылаться на один тикет. Не каждое письмо связано с билетом. Система электронной почты доступна только через API, а не через прямой доступ к базе данных.

Вот некоторые примеры данных:

Билеты

+----+----------------------+-------------+
| id | summary              | customer_id |
+----+----------------------+-------------+
| 1  | I have a big problem | 1           |
+----+----------------------+-------------+
| 2  | It doesn't work      | 2           |
+----+----------------------+-------------+
| 3  | Website is down      | 3           |
+----+----------------------+-------------+
| 4  | Still not working    | 1           |
+----+----------------------+-------------+
| 5  | Font is Comic Sans   | 4           |
+----+----------------------+-------------+
| 6  | Mouse doesn't work   | 1           |
+----+----------------------+-------------+
| 7  | You deserve pizza    | 1           |
+----+----------------------+-------------+
| 8  | Website slow         | 1           |
+----+----------------------+-------------+
| 9  | Website slow         | 1           |
+----+----------------------+-------------+

Сообщения электронной почты

+----+-------------------+------------------------+-----------+
| id | from              | subject                | ticket_id |
+----+-------------------+------------------------+-----------+
| 1  | anna@example.com  | Mouse mat is dirty     | 1         |
+----+-------------------+------------------------+-----------+
| 2  | anna@example.com  | Re: Mouse mat is dirty | 1         |
+----+-------------------+------------------------+-----------+
| 3  | bob@example.com   | Mouse click fails      | NULL      |
+----+-------------------+------------------------+-----------+
| 4  | bob@example.com   | Love your site         | 7         |
+----+-------------------+------------------------+-----------+
| 5  | carl@example.net  | Mouse cord cut         | 4         |
+----+-------------------+------------------------+-----------+
| 6  | carl@example.net  | Mouse doesn't work     | 6         |
+----+-------------------+------------------------+-----------+
| 7  | carl@example.net  | Mouse makes slow       | 8         |
+----+-------------------+------------------------+-----------+
| 8  | dave@example.net  | I hate my mouse        | 9         |
+----+-------------------+------------------------+-----------+

Я борюсь со следующим поиском: дай мне все билеты для клиента с идентификатором 1, которые связаны по крайней мере с 1 электронным письмом с "мышью" в теме.

Ожидаемый результат

+----+----------------------+
| id | summary              |
+----+----------------------+
| 1  | I have a big problem |
+----+----------------------+
| 4  | Still not working    |
+----+----------------------+
| 6  | Mouse doesn't work   |
+----+----------------------+
| 8  | Website slow         |
+----+----------------------+
| 9  | Website slow         |
+----+----------------------+

Возможный алгоритм

  • Найти все билеты, где customer_id = 1
  • Превратите это в список идентификаторов билетов
  • Найти все электронные письма, в которых тема содержит 'mouse' и ticket_id (список идентификаторов билетов)

пагинация

Теперь самая сложная часть: нумерация страниц. В нашем приложении такие таблицы результатов обычно имеют сортировку и разбиение на страницы. Например, если у вас есть только 2 результата на страницу, должна быть возможность отображать страницу 2 при сортировке в алфавитном порядке по сводке. Вы ожидаете увидеть билеты 6 и 8 на этой странице.

Я мог бы использовать вышеупомянутый алгоритм, чтобы найти все случаи в бэкэнде, определить, какой должна быть страница 2, и вернуть его во фронт. Или попросите фронтенд поговорить с обоими бэкэндами и примените эту логику. Но оба эти "решения" явно не подходят для большого количества билетов и / или электронных писем. Должно быть лучшее решение для этой проблемы.

Как бы вы решили эту проблему нумерации страниц?

0 ответов

Другие вопросы по тегам