2014-10-29 12 views
8

Sono sicuro di conoscere la risposta a questa domanda, ma cerco conferme da qualcuno con più esperienza Elasticsearch di me.Le migliori pratiche per gestire le relazioni molti-a-molti in Elasticsearch?

Diciamo che ho un database contenente Autori e Libri. Un autore può essere associato a 0 o più libri e un libro può essere associato a uno o più autori. Vogliamo che gli utenti siano in grado di cercare il nome dell'autore per trovare l'autore e tutti i suoi libri, e vogliamo anche che siano in grado di cercare il titolo del libro per ottenere il/i suo/i autore/i. Sappiamo che ci saranno molti libri multi-autore.

Poiché Elasticsearch supporta solo direttamente un livello di relazioni padre-figlio e poiché i bambini possono avere un solo genitore, mi sembra che dobbiamo denormalizzare i dati e utilizzare oggetti nidificati per stabilire questa relazione. Se modifichiamo le proprietà di un autore che ha pubblicato 23 libri, avremo bisogno di reindicizzare il record dell'autore e tutti i 23 dei suoi registri dei libri.

Nel mio mondo fantasy, mi piacerebbe avere quei 23 libri contenenti ciascuno una serie di ID autore in modo da non dover reindicizzare i libri quando reindex gli autori. Sembra che questo sarebbe sicuramente possibile utilizzando il supporto genitore-figlio di Elasticsearch se un libro può avere solo un autore, ma a causa del requisito molti-a-molti, devo usare oggetti annidati e reindicizzare qualsiasi oggetto correlato ogni volta che qualcosa cambia .

È corretto? Sembra certamente più lavoro (e sicuramente più aggiornamenti), ma voglio farlo nel modo giusto, non nel modo "intelligente" che introduce complessità, bug e follia.

Qualsiasi consiglio sarebbe apprezzato.

+0

Sì, è necessario denormalizzare. Ricordare che tutte le relazioni genitore-figlio forniscono lo zucchero sintattico per il parametro di instradamento che dirige un'operazione di ricerca o indice su un particolare frammento invece di colpire tutti i frammenti. È più un ottimizzazione delle prestazioni che uno strumento di modellazione. Dipende davvero da cosa hai bisogno al momento della query. –

+0

@JoelP. hai trovato il miglior approccio giusto per evitare molti aggiornamenti? –

risposta

3

Dalla tua domanda posso tranquillamente presumere che ES non sarà il tuo archivio dati principale. Quindi la domanda principale su come denormalizzare la tua relazione molti-a-molti è capire "come & cosa" userete ES. Questo è ciò che ci si aspetta che le query creino.

Pensare al progetto "comando query" e denormalizzare di conseguenza. Qui ci sono alcuni indicatori:

  • denormalizzare ID Autori nel libro: ci si può aspettare che un utente di eseguire una ricerca del tipo "tutto il libro per l'utente id = XYZ". In caso contrario, è necessario il nome dell'autore come campo multiplo nel documento Libro
  • duplicato, duplicato e duplicato. Capire quali dati saranno pesantemente aggiornati (autori, dato che il libro generale non ottiene l'autore dopo la loro pubblicazione). Denormalizzare l'autore nei libri (i nomi più probabili). Duplica (in un altro tipo di documento) qualcosa come "author_books" che sarà un figlio di autori e supporto aggiornamento abbastanza spesso (di nuovo, denormalizzare il titolo e altre cose rilevanti per la ricerca dal punto di vista dell'autore).

Spero che questo fa un certo senso;)

Problemi correlati