Как я могу разбить объединенные результаты на 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, и вернуть его во фронт. Или попросите фронтенд поговорить с обоими бэкэндами и примените эту логику. Но оба эти "решения" явно не подходят для большого количества билетов и / или электронных писем. Должно быть лучшее решение для этой проблемы.
Как бы вы решили эту проблему нумерации страниц?