묻고답하기
XML QUERY에서 JOIN시 질문드립니다.
2010.01.26 14:44
검색엔진을 구현하려고 합니다..
테이블 설계를
article_keyword // 키워드 테이블 (ex: 컴퓨터,노트북,의류 등등)
article_hash // Keyword와 document를 연결해주는 hash table
article_documents // 실제 문서
article_keyword table structure
------------------------------------------------------------------
key_id value
0 컴퓨터
1 노트북
2 의류
3 쇼핑몰
-------------------------------------------------------------------
article_hash table structure
-------------------------------------------------------------------
doc_id key_id
1 0
1 1
1 2
1 3
-------------------------------------------------------------------
article_documents table structure
-------------------------------------------------------------------
dic_id contents
1 컴퓨터 노트북 의류 쇼피몰...
-------------------------------------------------------------------
위처럼 테이블 설계가 되어있습니다.
XML QUERY를 이용해서 JOIN을 하려니 이해가 안되는 부분이 있습니다.
XE에서는 XML table노드에서 table type을 left join으로 해서 outer join종류는 가능하긴한데,
명시적으로 inner join이 가능하게 되어있지는 않도록 설계 되어있더군요.
다만 문제는 condition값을 추가할때 var값이 없을 경우엔 해당 condition이 query문에는 추가가 되지 않는것으로 알고 있습니다만,
inner join시 검색하려는 키워드값은 가변적이므로 이에 따른 join되는 테이블의 갯수를 유동적으로 처리가 가능한지입니다.
예를 들어 xml query문을 keyword_01 keyword_02로 분류하여 and조건으로 묶어 작성하였다면,
고정적인 쿼리문에서는 테이블 2개가 조인이 되어있는 상태인데
키워드가 1개만 입력이 되었을 경우엔 condition이 지정되지 않아 keyword_02의 테이블의 모든 데이터를 가져오게되는 일이 생겨버립니다.
xml쿼리문 안에 if문을 넣을수도 없고 이럴땐 어떤식으로 처리를 해야 키워드 갯수에 따라 유동적으로 추가하거나 수정할 수 있을련지요..
추가적으로,
문서가 입력될때마다 키워드를 분류하여 article_keyword테이블에 단어별로 구분하여 삽입하게 되어있습니다.
하지만, 이때 반복문을 통해서 쿼리를 날려주다보니 서버 과부하가 걸리는 일이 생기더라구요..
그래서 insert문에서 삽입되는 다중데이터를 한번의 query안에서 처리가 가능하던데,
XE에서는 XML QUERY를 어떤식으로 작성해야 가능한가요?
기존 classes에 있는 DB모듈을 변경해야 하는건지도 궁금합니다..
두서없이 작성한거라 앞뒷말이 잘 않맞지만 대략적으로 요약하자면,
1. XML QUERY작성시에 var로 연결되는 조건절에서 검색하려는 키워드가 없을경우에 join테이블을 유동적으로 추가하거나 삭제할 수 있는 방법.
2. XML QUERY에서 다중 데이터를 insert할때 한번의 QUERY문으로 다중 데이터를 서버 과부하없이 넣는 방법.
(기존 검색엔진 구현시에는 수십~수백개 되는 키워드를 어떤식으로 처리를 하는지요? 지금 제가 구현해놓은것처럼 반복문안에 쿼리를 계속 날려주는 방식은 아닐것으로 예상됩니다..)
현직 개발자 분들께서 좋은 방법이 있다면 말씀해주세요^^
1번만 좀 알 것 같아서 답변 드려볼게요.
XE에서 이용하는 XML Query는 solavity님께서 생각하시는 만큼 유동적이진 않아요.
XML파일은 조건의 값에 대해는 유동적이게 하는데 테이블에서는 어렵고요.
PHP에 의존하여 XML Query용 파일을 여러개 만들어서 구현하셔야 합니다.
inner outer는 xml 에서 <table ... type="left join"> 이부분에서 말씀하시는 건지요?
그 부분은 left right는 되고 inner는 그냥 colum="a.a" var="b.a" 이렇게만 되네요.
유동적이기 어려운 이유가 여러 DB의 호환을 다 맞춰야하기 때문에 Query 자체의 기능적인 부분에 많이 제약을 줄 수 밖에 없다고 하더군요.(들은 얘기)
2번은 제가 잘 모르긴 하는데요. 수백개를 부화없이 좋게 하려면 결국 Query문이 좋아야한다던가 뭐 그럴 것 같은데 XML Query로는 단순하기 때문에 반복문일 걸로 예상 됩니다.
원하시는 것이 XML Query로는 안된다고 느껴지시면 직접 쿼리를 날리는 수밖엔 없습니다.
{@
$oDB = &DB::getInstance();
$result = $oDB->_query("select * from xe_documents");
$output = $oDB->_fetch($result);
}
<!--@foreach($output as $key => $val)-->
{$val->document_srl}
<!--@endforeach-->
이런식으로요... ^^
- 추가(2010.01.26 15:05)