# Parent-Child или plain документ

**URL:** <https://discuss.elastic.co/t/parent-child-plain/66066>\
**Category:** Вопросы на русском языке\
**Created:** [November 15, 2016, 7:45am UTC](https://discuss.elastic.co/t/parent-child-plain/66066 "2016-11-15T07:45:16Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![griand](https://avatars.discourse-cdn.com/v4/letter/g/a4c791/32.png) [@griand](https://discuss.elastic.co/u/griand)\
**Post date:** [November 15, 2016, 7:45am UTC](https://discuss.elastic.co/t/parent-child-plain/66066/1 "2016-11-15T07:45:16Z")

</div>

Добрый день.

Помогите определиться с оптимальной структурой для хранения документов.  
Структура следующая `Set<Company>->Set<Branch>->Set<Customer>`. Компании имеют филиалы, в которых есть сотрудники. Основная задача это быстро искать, фильтровать, аггрегировать по полям customer и branch.

Есть 3 варианта.

1. Хранить Company, Branch, Customer каждый в своем типе индекса и связать их через отношение parent-child.
2. Хранить данные отдельно в каждом плоском документе Company+Branch+Customer
3. Хранить в каждом документе дерево Company+Nested[Branch+Nested[Customer]]

Для всех вариантов elastic предлагает функционал для поиска, фильтрации и аггрегирования (не буду перечислять). Более того, как сказано в документации, nested поля это те же отдельные самостоятельные документы, которые elastic связывает через маппинг.

Только для parent-child есть некоторые ограничения, например:

> Parent and child documents must be indexed on the same shard. The parent ID is used as the routing value for the child, to ensure that the child is indexed on the same shard as the parent. This means that the same parent value needs to be provided when getting, deleting, or updating a child document.

значит ли это, что я должен следить за тем, чтобы parent-child документы были проиндексированы на едином шарде?

При условии, что основная задача это быстро искать, фильтровать и аггрегировать по полям customer и branch, какой из способов хранения документов может быть оптимальным? Может быть какой-то из способов занимает больше места на диске или использует больше памяти, ведь для аггрегирования необходимо загрузить документы в память и тогда 2 вариант здесь более предпочтителен.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 18, 2016, 5:39pm UTC](https://discuss.elastic.co/t/parent-child-plain/66066/2 "2016-11-18T17:39:18Z")

</div>

> [@griand](#):
>
> значит ли это, что я должен следить за тем, чтобы parent-child документы были проиндексированы на едином шарде?

Для детей и родителей elasticsearch следит за всем сам. Для внуков и правнуков и т.д. это достигается использованием параметра `routing`. К примеру,

`PUT my_index/company/acme_corp` - тут ничего делать не надо  
`PUT my_index/branch/acme_russia?parent=acme_corp` - достаточно указать родителя, и эта запись попадет в туже шарду  
`PUT my_index/customer/vasya_pupkin?parent=acme_russia&routing=acme_corp` - c этого уровня надо указывать и родителя в `parent` и прорадителя в `routing`

> [@griand](#):
>
> При условии, что основная задача это быстро искать, фильтровать и аггрегировать по полям customer и branch, какой из способов хранения документов может быть оптимальным?

Надо смотреть на конкретные примеры поисков, объем данных на каждом уровне и как часто ити данные меняются для branch и company.

---

<div class="post-metadata">

**Author:** ![griand](https://avatars.discourse-cdn.com/v4/letter/g/a4c791/32.png) [@griand](https://discuss.elastic.co/u/griand)\
**Post date:** [November 18, 2016, 6:45pm UTC](https://discuss.elastic.co/t/parent-child-plain/66066/3 "2016-11-18T18:45:56Z")

</div>

Игорь, спасибо большое за ответ.

Еще раз перечитал раздел [Modeling Your Data](https://www.elastic.co/guide/en/elasticsearch/guide/2.x/modeling-your-data.html) и нашел ответ на вопрос:

> Parent-child joins can be a useful technique for managing relationships when index-time performance is more important than search-time performance, but it comes at a significant cost. Parent-child queries can be 5 to 10 times slower than the equivalent nested query!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [December 16, 2016, 6:46pm UTC](https://discuss.elastic.co/t/parent-child-plain/66066/4 "2016-12-16T18:46:06Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
