2014-07-25 5 views
4

올바른 질문인지 아닌지는 모르겠지만 호기심 때문에 빨리 검색 할 것임을 알고 싶습니다. 전직XML 검색 - 노드 또는 텍스트 내의 텍스트가 속성 값으로

를 들어
<A> 
    <Name>John</Name> 
</A> 

또는 내가 속성 값으로 텍스트의 수백만을 저장 한

<A> 
    <Name n="John"/> 
</A> 

, 아니지만 문자 크기가 큰만큼. 위의 질문은 더 나은 이해를 돕기위한 예입니다.

이제 BaseX, eXists 등의 XML 데이터베이스를 사용하는 경우 모든 이름을 검색하거나 생성하고 색인을 생성하려고합니다.

+0

이 두 변형의 차이는 XSLT를 개발하는 동안 만들 수있는 다른 디자인 결정 (예 : 색인 사용, 템플릿 일치 패턴, XSLT 용 이진 도구 선택, 숫자 공구 호출 수). 구체적인 경우에는 속성의 내용이 시작 태그와 닫기 태그 사이의 하위 트리의 일반적인 경우와 비교하여 비교적 제한적이기 때문에 속성 기반 변형이 약간 더 간단한 구문 분석 요구 사항으로 인해 약간 더 빠를 수도 있습니다. –

답변

1

이것은 구현에 따라 다르므로 모든 XML 데이터베이스에 대해이를 일반화 할 수 없습니다. 이 간단한 경우에는 모든 데이터베이스에서 동일하다고 생각합니다. 중요하지 않습니다.

여기서 BaseX에 대해 설명 할 예정입니다. 첫 번째 구조를 사용하고 <A/> 요소를 가져 오려고한다고 가정 해 보겠습니다.

//A[Name/@n = "John"] 
: 아마도 다음과 같을 것이다

db:text("your-database", "John")/parent::*:Name/parent::*:A 

두 번째 데이터 구조는 XPath 반면 : 그래서 당신은

//A[Name = "John"] 

이 다음 쿼리를 최적화 할 것 같은 XPath를 사용

db:attribute("your-database", "John")/self::*:n/parent::*:Name/parent::*:A 

여러분이 볼 수있는 것처럼, 하나의 경로 단계를 제외하고는 (속성에 액세스해야하기 때문에) 매우 쌌습니다. 가장 큰 차이점은 db:text()db:attribute()입니다. 그러나 documented으로,이 함수는 모두 값 인덱스 (있는 경우)를 사용하며 (기본적으로) 인덱스 조회 덕분에 매우 빠릅니다.

실제로 XML 기반 응용 프로그램을 설계하고 나중에 XQuery를 사용하여 정보를 검색하려는 경우 다른 병목 현상이 발생합니다. 쿼리를 사용하는 인덱스가 아닌 인덱스 또는 for 중첩 된 루프