문제

로그 분석 응용 프로그램을 작성한다고 가정 해 봅시다. 기본 도메인 객체는 로그 entry입니다. 게다가. 응용 프로그램 사용자는 관심있는 로그 항목을 설명하는 로그 토프를 정의합니다. 응용 프로그램이 로그 항목을 수신하므로 CouchDB에 추가하고 시스템의 모든 로그 토픽에 대해 확인하여 주제의 기준과 일치하는지 확인합니다. . 그렇다면 시스템은 항목이 주제와 일치한다고 기록해야합니다. 따라서 로그 텐트와 로그 토픽 사이에는 다수의 관계가 있습니다.

rdbms에 이것을 저장하고 있다면 다음과 같은 일을 할 것입니다.

CREATE TABLE Entry (
 id int,
 ...
)

CREATE TABLE Topic (
 id int,
 ...
)

CREATE TABLE TopicEntryMap (
 entry_id int,
 topic_id int
)

CouchDB를 사용하여 먼저 두 가지 문서 유형 만 사용해 보았습니다. 나는 로트 틀리 유형을 가질 것입니다.

{
  'type': 'LogEntry',
  'severity': 'DEBUG',
  ...
}

그리고 나는 다음과 같은 것을 보면서 로그 토프 유형을 가질 것입니다.

{
  'type': 'LogTopic',
  'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
  ...
}

당신은 내가 matching_entries 각 logtopic 문서의 필드 로그 entry 문서 ID 목록을 저장합니다. 이것은 어느 시점까지 잘 작동하지만 여러 클라이언트가 주제에 일치하는 항목을 추가하려고 시도 할 때 문제가 있습니다. 둘 다 낙관적 업데이트를 시도하고 하나는 실패합니다. 내가 지금 사용하고있는 솔루션은 RDBMS 접근 방식을 본질적으로 재현하고 다음과 같은 세 번째 문서 유형을 추가하는 것입니다.

{
  'type':'LogTopicToLogEntryMap',
  'topic_id':'topic_12',
  'entry_id':'entry_15'
}

이것은 효과가 있으며 동시 업데이트 문제를 넘어서지 만 두 가지 예약이 있습니다.

  1. 나는이 접근법이 관계형 DB에서하는 일이기 때문에 단지이 접근법을 사용한다고 걱정합니다. 더 CouchDB와 같은 (편안한?) 솔루션이 있는지 궁금합니다.
  2. 내 견해는 한 번의 호출에서 특정 주제에 대한 모든 항목을 더 이상 검색 할 수 없습니다. 이전 솔루션에서는이를 허용했습니다 (include_docs 매개 변수를 사용한 경우).

누구든지 나에게 더 나은 솔루션이 있습니까? 내가 사용중인 뷰도 게시하면 도움이 될까요?

도움이 되었습니까?

해결책

당신의 접근 방식은 괜찮습니다. CouchDB를 사용한다고해서 관계형 모델링을 포기한다는 의미는 아닙니다. 두 개의 쿼리를 실행해야하지만 이것이 "조인"이기 때문입니다. 조인이있는 SQL 쿼리도 느리지 만 SQL 구문을 사용하면 쿼리를 하나의 문으로 표현할 수 있습니다.

CouchDB에 대한 몇 달의 경험에서 이것은 내가 발견 한 것입니다.

  1. 스키마가 없으므로 응용 프로그램 모델을 설계하는 것은 빠르고 유연합니다.
  2. Crud가 있으므로 응용 프로그램을 개발하는 것은 빠르고 유연합니다.
  3. 안녕 SQL 주입
  4. SQL 조인은 CouchDB에서 조금 더 작업 할 수 있습니다.

귀하의 요구에 따라 CouchDB-Lucene은보다 복잡한 쿼리를 구축하는 데 유용하다는 것을 알았습니다.

다른 팁

나는이 질문을 교차 포기했다 CouchDB 사용자 메일 링리스트 그리고 Nathan Stott 나를 지적했다매우 유용한 블로그 게시물 Christopher Lenz

나는 로트 니트가 자신이 속한 로그 토픽을 알 수 있도록 관계를 설정하려고합니다. 이렇게하면 Logtopics를 변경할 필요가 없으므로 로그 entry를 삽입하면 충돌이 발생하지 않습니다.

그런 다음 간단한 맵 함수는 각 로그 토프에 대해 로그 entry를 한 번 방출합니다.

"map": function (doc) {
    doc.topics.map(function (topic) {
        emit(topic, doc);
    });
}

이런 식으로, a로보기를 쿼리합니다 ?key=<topic> 인수는 주제에 속하는 모든 항목을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top