2009-04-08 3 views
0

질문을 위해 이름> 중간 이름> 성 계층 (~ 10k 행)이 있다고 가정 해 보겠습니다. 즉, "John> Mary-Anne> Eddy"또는 "Eddy> John> Jacob"행을 가질 수 있습니다. 요점은 계층 구조가 거의 이해가되지 않으며 사용자에게 매우 외국적인 것입니다 (예 : 국가> 주> 도시 구조).3 레벨 계층 구조를 효율적으로 검색

구조가 복잡하고 혼란 스럽기 때문에 사용자에게 자동 완성 입력 상자를 제공하고 싶습니다. 그들이 입력 할 때 가능한 부분 문자열 일치를 검색해야하며, 검색 문자열이 한 레벨에서 "루트"될 때 그 결과를 그 레벨 아래로 제한합니다. "요"라는 많은 사람들이 있기 때문에 지금

는, 그것은>가 입력 한 경우 "요한은"그들은 단지

  • 존> 알렌과 같은 결과를 다시 얻을 거의 의미가 알렉산더
  • 존> 알렌> Burschawitz
  • 존> 알렌 ... 반복 100 배 ...

그들은 고유 한 행 "제이슨> 존> 스미스"를 볼 수 없을테니까.

대신, 그들은 다시 뭔가를 얻어야한다 ("*" "이 존재 아래 이봐, 더 많이 행"의 사용자 단지 임의의 지표) :

  • 존> 알렌> *
  • 제이슨> 존> 스미스는
  • 마이크> 존> *
  • 마리아> 엘레나> Johnason

가 입력 한 경우 "존> 알은"다음 결과가 될 것이다 "John>"아래에있는 것으로 제한되지만 위와 마찬가지로 그룹화해야합니다.

설명이 명확 해 주시기 바랍니다. 요구 사항은 다소 느슨합니다. 사람이 나무를 수색하고 그들이 무엇을 발견 할 수 있도록 그냥 합리적인 것들.

지금 당장은 행의 검색어를 찾고 위치를 파악하고 위의 결과를 얻기 위해 일부 substring'ing, group bys 및 order by를 수행하는 재미있는 SQL을 가지고 있지만 실적이 좋지 않습니다 충분히.

전형적인 램프 스택 (Oracle 제외)에서이 문제를 해결하려고합니다. 공유 호스팅이 아니므로 서버를 완전히 제어 할 수 있습니다. 몇 주에 한 번씩 데이터가 조금씩 변경되며 합리적인 시간 동안 검색 결과가 오래 보관 될 수 있습니다 (예 : 검색 색인을 업데이트하는 cron이 문제가되지 않음).

+0

나는 정확히 말하면, 네가하는 것을 정확히 이해할 수 없다. 네가 더 명확해질 수 있는지 나는 모른다. – 108

+0

글쎄 ... 아마 더 나은 비유 : URL 목록이 있고 "com"을 검색했다면 domain.com/a, domain.com/b, domain.com/b를 원하지 않을 것입니다. 당신은 "domain.com/"을 원할 것입니다. 그 결과는 "other.org/Computers" –

+0

일 수 있습니다. domain.com/a,/b,/c를 원하지 않는 이유는 다른 결과가 많이 나오기 때문입니다 지금까지는 상위 10 개 결과에 나타나지 않았습니다. –

답변

0

아아. 미안해. 내 문제를 설명 할 수 없었다. 어쨌든, 여기 나와있는 해결책이 있습니다.

기본적으로 계층의 각 연속 수준에 대한 모든 고유 값과 계층에서 해당 행의 깊이를 나타내는 열을 포함하는 3 열 테이블에서 두 번째 테이블을 만듭니다.

예.mytable(A, B, C)에서 "하나> 두> 세"와 그래서 search_t(A, B, C, level)

을 작성, 당신은 3 행 (A, B, C, 레벨) 생성 : NULL, NULL,

  • "한"1
  • "하나", "2", NULL, 2
  • "하나", "2", "세", 3

검색, 당신이 수준의 값을 선택하여 레벨을 제한 할 수 있으며, 상위 수준 열에 대한 값 제공 :

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

당신이 search_str 열을 생성하고 그 대신에 대한 LIKE 매칭을 수행하는 경우 그것은 조금 단순화 및 일반 될 수 있습니다. 데이터가 인접리스트 모델에서 이미 있다면

WHERE A='One' and level > 1 and search_str like '%t%'

는 돌이켜 보면, 이것은 아마 더 분명했을 것이다.

관련 문제