제 3 자 웹 서비스에서 긁어 모으고있는 수백 개의 서비스에 대한 테이블이 있습니다. 서비스에는 내가 받고있는 수백만 개의 기호가 있습니다.
계층 구조는 본질적으로 이것입니다.
root
|_service1
| |_service1/sub1*
| |_service1/sub2
| |_service1/sub3
| |_service1/sub4
| | |_service1/sub4/sub1
| | |_**service1/sub4/sub1/leaf1**
| |
| |_service1/sub5
|
|_service2
|_service2/sub1
|_service2/sub2
|_service2/sub3
그래서 내가 달성하려는 것은-잎에 대한 Id가 주어지면 분기가 isActive 인 것을 찾을 때까지 트리를 작업하고 그 값을 반환하고 싶습니다.
이 예에서 나는 잎의 활성 서비스를 찾으려면, /service1/sub4/sub1/leaf1
이 경우에service1/sub1
지금까지는 Common Table Expression을 사용하여 위에서 아래로 작업하고 해당 분기 아래에있는 잎에 추가 ActiveServiceId 열을 설정했습니다. 수백만 개의 기호가 매우 오래 실행되는 프로세스로 바뀝니다.
나는 기호의 아주 작은 하위 집합으로 만 작업하고 있습니다 (비록 어떤 기호가 필요한지 모르지만 모두 필요함). 따라서 쿼리 당시 알려진 리프 ID는 수백에 불과합니다.
도움을 줄 수있는 모든 사람을 돕기 위해이 계층 구조 를 반영 하는 SQLFiddle 을 만들었습니다.
현재 접근 방식을 추가로 설명하는 업데이트 . 이것이 service1
새로운 활성 서비스 로 결정된 경우 -모든 하위 분기의 service1 아래에있는 잎은 service1로 버블 링되어야하며 모든 하위 분기를 재설정하여 활성으로 표시되지 않도록합니다.
이 데이터를 저장하기 위해 중첩 세트를 사용하는 것이 유용 할 수 있습니다.
http://en.wikipedia.org/wiki/Nested_set_model
이전에이 방법을 사용하여 데이터베이스에 트리 데이터를 저장했으며 부모 아래의 모든 노드에 속하는 데이터를 쿼리하는 데 유용하다는 것을 알았습니다.
중첩 된 집합에 저장된 데이터를 사용하면 문제에 대한 해결책은 다음과 같습니다.
SELECT s.ID
FROM TreeTable s
WHERE s.L = (SELECT Max(t.L)
FROM TreeTable t, TreeTable LeafNode
WHERE t.isActive = true
AND t.L < LeafNode.L
AND t.R > LeafNode.R
AND LeafNode.ID = ?)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다