2014-10-29 7 views
8

나는이 질문에 대한 답을 알고 있지만 나보다 Elasticsearch 경험이 많은 사람에게서 확인을 찾고 있다고 확신한다.Elasticsearch에서 다 대다 관계를 처리하는 가장 좋은 방법은 무엇입니까?

저자와 도서가 포함 된 데이터베이스가 있다고 가정 해 봅니다. 저자는 0 개 이상의 서적과 연관 될 수 있으며 서적은 1 명 이상의 저자와 연관 될 수 있습니다. 우리는 사용자가 저자 이름을 검색하여 저자와 모든 책을 찾을 수있게하고, 책 제목을 검색하여 저자를 되찾기를 원합니다. 우리는 여러 저자의 책이 많이 있다는 것을 알고 있습니다.

Elasticsearch는 한 수준의 부모 - 자식 관계 만 직접 지원하기 때문에 자식은 부모를 하나만 가질 수 있기 때문에이 관계를 설정하기 위해 데이터를 비정규 화하고 중첩 된 개체를 사용해야합니다. 우리가 23 권의 책을 출간 한 저자의 속성을 수정하면 저자 기록과 23 권의 모든 도서 기록을 다시 색인해야합니다.

내 환상의 세계에서 저자 색인을 다시 작성할 필요가 없도록 제 23 권의 도서에 일련의 저자 ID가 포함되도록하고 싶습니다. 책이 한 명의 저자 만 가질 수 있다면 Elasticsearch의 부모 - 자식 지원 을 사용하는 것이 가능할 것 같지만, 다 대다 요구 사항으로 인해 변경 될 때마다 중첩 된 객체를 사용하고 관련 객체를 다시 색인해야합니다. .

이 정보가 맞습니까? 분명히 더 많은 작업 (확실히 더 많은 업데이트)처럼 보이지만 복잡하고 버그와 광기를 가져 오는 "똑똑한"방식이 아니라 올바른 방법으로이 작업을 수행하려고합니다.

모든 안내를 받으실 수 있습니다.

+0

예, 당신은 비정규해야합니다. 모든 부모 - 자식 관계 제공은 모든 샤드를 치는 대신 검색 또는 색인 작업을 특정 샤드로 지정하는 라우팅 매개 변수에 대한 구문 적 설탕이라는 것을 명심하십시오. 모델링 도구보다 성능 최적화가 더 중요합니다. 그것은 정말로 당신이 쿼리 시간에 무엇을 필요로 하느냐에 달려 있습니다. –

+0

@ JoeP. 많은 업데이트를 막는 최선의 방법을 찾았습니까? –

답변

3

귀하의 질문에 나는 ES가 귀하의 기본 데이터 저장소가 아닐 것이라고 생각합니다. 따라서 다 대다 관계를 비정규 화하는 방법에 대한 주된 질문은 "&"이 어떻게 ES를 사용하는지 파악하는 것입니다. 그것이 당신이 기대하는 쿼리입니다.

"쿼리 명령"을 생각하고 그에 따라 비정규 화합니다. 책에

  • denormalising 저자 아이디 : 여기에 몇 가지 포인터는 것 당신이 사용자는 "모든 userId를위한 책 = XYZ"로 검색을 할 전망이다. 그렇지 않다면 오히려 귀하의 도서 서적에 복수 저자로 된 저자명이 필요합니다.
  • 중복, 복제 및 복제. 어떤 데이터가 크게 업데이트 될지 파악하십시오 (저자는 책 일반이 발행 후에 저자를 얻지 못함). 저자를 책 (대부분의 이름)으로 역 정규화하십시오. 저자의 자녀가 될 수있는 "author_books"와 같은 것을 (다른 문서 유형으로) 복제하면 꽤 자주 업데이트됩니다 (다시 말하면 제목과 기타 관련 자료를 저자 관점에서 검색 할 수 없도록 비정규 화합니다). 이것은 어떤 의미가

희망)

관련 문제