Ответ 1
Существует 4 подхода, которые вы можете использовать в Elasticsearch для управления отношениями. Они очень хорошо описаны в сообщении блога Elasticsearch - Управление отношениями внутри Elasticsearch. Я бы рекомендовал прочитать всю статью, чтобы получить более подробную информацию о каждом подходе, а затем выбрать тот подход, который наилучшим образом соответствует вашим потребностям бизнеса, оставаясь при этом технически подходящим.
Вот основные моменты для 4-х подходов.
Внутренний объект
- Легкая, быстрая, эффективная
- Только применимо, когда поддерживаются отношения "один-к-одному"
- Нет необходимости в специальных запросах
Уплотненный
- Вложенные документы хранятся в одном блоке Lucene как друг для друга, что помогает повысить производительность чтения/запроса. Чтение вложенного документа происходит быстрее, чем эквивалент parent/child.
- Обновление одного поля во вложенном документе (родительские или вложенные дочерние элементы) заставляет ES переиндексировать весь вложенный документ. Это может быть очень дорого для больших вложенных документов
- "Перекрестные ссылки" вложенные документы невозможны.
- Лучше всего подходит для данных, которые часто не меняются.
Parent/Child
- Дети хранятся отдельно от родителя, но направляются в один и тот же осколок. Таким образом, родительские/дочерние элементы имеют немного меньшую производительность при чтении/запросе, чем вложенные
- Сопоставления родителя/дочернего элемента имеют немного дополнительные издержки памяти, так как ES поддерживает список "join" в памяти
- Обновление дочернего документа не влияет на родителя или других детей, что потенциально может сэкономить много индексирования на больших документах
- Сортировка/оценка может быть затруднена с помощью родителя/ребенка, так как операции с дочерними/родительскими операциями могут быть непрозрачными в разы
Денормализация
- Вы сами управляете всеми отношениями.
- Наиболее гибкие, большинство административных издержек
- Может быть более или менее результативным в зависимости от вашей настройки.