2014-10-29 15 views
8

Jestem prawie pewien, że znam odpowiedź na to pytanie, ale szukam potwierdzenia od kogoś, kto ma więcej doświadczenia z Elasticsearch niż ja.Najlepsza praktyka w obsłudze relacji wielu do wielu w Elasticsearch?

Załóżmy, że mam bazę danych zawierającą autorów i książki. Autora można powiązać z co najmniej 0 książkami, a książkę można powiązać z jednym lub kilkoma autorami. Chcemy, aby użytkownicy mogli wyszukiwać nazwisko autora w celu znalezienia autora i wszystkich jego książek, a także chcemy, aby mogli wyszukiwać tytuł książki, aby odzyskać jej autora (autorów). Wiemy, że będzie wiele książek dla wielu autorów.

Ponieważ Elasticsearch obsługuje tylko bezpośrednio jeden poziom relacji rodzic-dziecko, a ponieważ dzieci mogą mieć tylko jednego rodzica, wydaje mi się, że musimy zdenormalizować dane i użyć zagnieżdżonych obiektów, aby ustalić tę relację. Jeśli zmodyfikujemy właściwości autora, który opublikował 23 książki, będziemy musieli ponownie zindeksować rekord autora i wszystkie 23 jego zapisy w książce.

W moim świecie fantasy chciałbym, aby te 23 książki zawierały wiele identyfikatorów autorów, więc nie będę musiał ponownie indeksować książek, gdy ponownie wyszukuję autorów. Wygląda na to, że byłoby to możliwe przy użyciu obsługi nadrzędnej-podrzędnej Elasticsearch , jeśli książka może mieć tylko jednego autora, ale ze względu na wymaganie wiele do wielu, muszę użyć zagnieżdżonych obiektów i ponownie indeksu wszelkich powiązanych obiektów, gdy coś się zmieni .

Czy to prawda? Z pewnością wydaje się, że więcej pracy (i na pewno więcej aktualizacji), ale chcę to zrobić we właściwy sposób, a nie "sprytny" sposób, który wprowadza złożoność, błędy i szaleństwo.

Wszelkie wskazówki będą mile widziane.

+0

Tak, trzeba denormalize. Należy pamiętać, że wszystkie relacje nadrzędny-podrzędny zapewniają cukier syntaktyczny dla parametru routingu, który kieruje operację wyszukiwania lub indeksu do określonego fragmentu zamiast uderzać w wszystkie odłamki. Jest to bardziej optymalizacja wydajności niż narzędzie do modelowania. To naprawdę zależy od tego, czego potrzebujesz w czasie zapytania. –

+0

@JoelP. czy znalazłeś najlepsze właściwe podejście, aby zapobiec wielu aktualizacjom? –

Odpowiedz

3

Z twojego pytania mogę bezpiecznie założyć, że ES nie będzie twoim głównym magazynem danych. Tak więc głównym pytaniem, jak denormalizować relację wiele do wielu, jest dowiedzieć się, "w jaki sposób użyjesz ES. Właśnie tego oczekuje się od zapytań.

Myślenie o projekcie "polecenia zapytania" i odpowiednio go denormalizuj. Oto kilka wskazówek:

  • denormalizing ID autorów do książki: czy można oczekiwać, że użytkownik wykona wyszukiwanie, takie jak "all book for userId = XYZ". Jeśli nie, wolałbyś, aby nazwisko autora było wieloczynnikowe w Twoim dokumencie Książki, duplikowanym, duplikowanym i powielanym. Ustal, które dane będą mocno aktualizowane (autorzy, jako że książka generalna nie zyskuje autora po publikacji). Denormalizuj autora w książki (najprawdopodobniej nazwy). Zduplikuj (na inny typ dokumentu) coś w rodzaju "author_books", które będzie dość często autorami i aktualizacją pomocy technicznej (ponownie, zdenormalizuj tytuł i inne istotne treści do wyszukiwania z perspektywy autora).

Nadzieja to sprawia, że ​​jakiś sens;)

Powiązane problemy