키 값 데이터 저장소에 디렉터리 계층 저장
Key-Value 데이터베이스(내 경우 MongoDB를 제외한 다른 데이터베이스)에 디렉터리 계층/트리를 저장하는 깨끗하고 효율적인 방법은 무엇입니까?
예를 들어 트리 구조
- Cars
+ Audi
+ BMW
- M5
+ Ford
- Color
+ Red
- Apple
- Cherry
+ Purple
- Funny
지금 사용하는 메서드, 각 개체는 상위 개체에 연결됩니다.
{
dir: "red"
parent-dir: "color"
}
이렇게 하면 트리의 모든 부분을 매우 효율적이고 빠르게 삽입하고 재정렬할 수 있습니다(예: 빨간색과 모든 하위 항목을 Cars 디렉토리로 이동하려는 경우).
그러나 이 방법은 모든 하위 디렉터리와 하위 디렉터리의 하위 디렉터리를 재귀적으로 사용하려는 경우에는 적합하지 않습니다.구문 분석을 효율적으로 하기 위해 예를 들어 구조를 가질 수 있습니다.
{
dir: "red"
children: "audi, bmw, ford"
}
{
dir: "bmw"
children: "m5"
}
하지만 제가 트리를 수정하고 싶다면, 많은 물체들을 만지고 수정해야 합니다.
KV 저장소에 디렉터리 구조를 저장하는 다른 방법이 있습니까?
현재 사용하는 방법을 인접 목록 모델이라고 합니다.
계층적 데이터를 (관계형) 데이터베이스에 저장하는 또 다른 모델은 중첩 집합 모델입니다.SQL 데이터베이스에 구현된 것은 잘 알려져 있습니다.수정된 사전 주문 트리 트래버설 알고리즘에 대해서도 이 문서를 참조하십시오.
매우 간단한 방법입니다. 객체당 경로를 저장할 수 있습니다. 이러한 방법을 사용하면 NOSQL 데이터베이스의 트리를 쉽게 쿼리할 수 있습니다.
{ path: "Color", ... }
{ path: "Color.Red", ... }
{ path: "Color.Red.Apple", ... }
{ path: "Color.Red.Cherry", ... }
노드가 제거되거나 이름이 변경되면 일부 경로를 업데이트해야 합니다.그러나 일반적으로 이 방법은 유망해 보입니다.당신은 특별한 캐릭터를 구분자로 예약하면 됩니다.저장 공간 오버헤드는 무시해도 될 정도입니다.
편집: 이 방법을 구체화된 경로라고 합니다.
마지막으로 NOSQL 데이터베이스의 계층적 데이터에 대한 다양한 방법을 비교합니다.
저는 NOSQL에 대한 경험이 많지 않기 때문에 이것이 확실한 답은 아니지만, 다음과 같이 접근할 수 있습니다.
첫 번째 접근 방식을 사용할 것입니다. 여기에는 다음과 같은 방법이 방법이 있습니다.
{
dir: 'dir_name',
parent_dir: 'parent_dir_name'
}
그런 다음 디렉터리의 하위 항목을 빠르게 쿼리하도록 맵 축소를 설정합니다.MongoDB의 맵리듀스 기능은 아직 개발 부서에서만 사용할 수 있고 저는 아직 이 기능을 사용하지 않았지만 CouchDB(MongoDB에서 약간의 수정만 있으면)에서는 다음과 같은 작업을 수행할 수 있습니다.
map:
function(doc) {
emit( doc.parent_dir, doc.dir );
}
reduce:
function(key, values) {
return( values );
}
그러면 각 상위 디렉터리의 하위 디렉터리 목록이 표시됩니다.
저는 데이터 항목의 ID에 힙을 저장하는 것을 제안합니다.저는 이게 최선의 계획이라고 생각합니다.많은 정보가 필요한 경우 힙 요소가 다른 힙의 인덱스가 될 수 있습니다.
예를 들어
{ "id:xxx", "id:yyy", "sub-heap-id:zzz"....}
만약 이것이 명확하지 않다면 댓글을 달아주시면 제가 집에 가서 더 설명하겠습니다.
색인을 만드세요!
http://www.mongodb.org/display/DOCS/Indexes
언급URL : https://stackoverflow.com/questions/1619058/storing-directory-hierarchy-in-a-key-value-data-store
'programing' 카테고리의 다른 글
Python 프로젝트에서 상대 경로를 사용하여 파일 읽기 (0) | 2023.05.18 |
---|---|
UITapGesture Recognizer가 있는 뷰 내부의 UIButton (0) | 2023.05.18 |
3차 연산자 VB vs C#: 왜 아무것도 0으로 해결하지 않습니까? (0) | 2023.05.18 |
Pymongo 결과에서 _id 요소 제거 (0) | 2023.05.18 |
Ctrl-스페이스를 누르지 않은 이클립스의 Ctrl-스페이스 (0) | 2023.05.18 |