[SQL] 파일 시스템의 디렉토리 경로 계층 / 트리 데이터베이스
SQL파일 시스템의 디렉토리 경로 계층 / 트리 데이터베이스
나는 그들의 계층 / 트리 구조를 유지, 데이터베이스에 디렉토리 (디스크에 존재)을 저장할.
여기에 그림입니다 :
(ROOT) / \ Dir2 Dir3 / \ \ Dir4 Dir5 Dir6 / Dir7
나는 SQLite 데이터베이스를 사용하고 있습니다.
저를 제안하십시오 :
해결법
-
==============================
1.여기에 SQLite는 대한 빠른 폐쇄 테이블 예입니다. 나는 기존의 트리에 항목을 삽입 문을 포함하지했습니다. 대신에, 난 그냥 수동으로 문을 만들었습니다. 당신은 계층 적 데이터 슬라이드에 대한 모델의 삽입과 삭제 문을 찾을 수 있습니다.
여기에 SQLite는 대한 빠른 폐쇄 테이블 예입니다. 나는 기존의 트리에 항목을 삽입 문을 포함하지했습니다. 대신에, 난 그냥 수동으로 문을 만들었습니다. 당신은 계층 적 데이터 슬라이드에 대한 모델의 삽입과 삭제 문을 찾을 수 있습니다.
디렉토리에 대한 ID를 삽입 내 정신을 위해, 나는 자신의 ID와 일치하는 디렉토리의 이름을 변경 :
(ROOT) / \ Dir2 Dir3 / \ \ Dir4 Dir5 Dir6 / Dir7
테이블 만들기
CREATE TABLE `filesystem` ( `id` INTEGER, `dirname` TEXT, PRIMARY KEY (`id`) ); CREATE TABLE `tree_path` ( `ancestor` INTEGER, `descendant` INTEGER, PRIMARY KEY (`ancestor`, `descendant`) );
파일 시스템 테이블에 디렉토리를 삽입
INSERT INTO filesystem (id, dirname) VALUES (1, 'ROOT'); INSERT INTO filesystem (id, dirname) VALUES (2, 'Dir2'); INSERT INTO filesystem (id, dirname) VALUES (3, 'Dir3'); INSERT INTO filesystem (id, dirname) VALUES (4, 'Dir4'); INSERT INTO filesystem (id, dirname) VALUES (5, 'Dir5'); INSERT INTO filesystem (id, dirname) VALUES (6, 'Dir6'); INSERT INTO filesystem (id, dirname) VALUES (7, 'Dir7');
폐쇄 테이블 경로 만들기
INSERT INTO tree_path (ancestor, descendant) VALUES (1, 1); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 2); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 3); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 4); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 5); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 6); INSERT INTO tree_path (ancestor, descendant) VALUES (1, 7); INSERT INTO tree_path (ancestor, descendant) VALUES (2, 2); INSERT INTO tree_path (ancestor, descendant) VALUES (2, 4); INSERT INTO tree_path (ancestor, descendant) VALUES (2, 5); INSERT INTO tree_path (ancestor, descendant) VALUES (2, 7); INSERT INTO tree_path (ancestor, descendant) VALUES (3, 3); INSERT INTO tree_path (ancestor, descendant) VALUES (3, 6); INSERT INTO tree_path (ancestor, descendant) VALUES (4, 4); INSERT INTO tree_path (ancestor, descendant) VALUES (4, 7); INSERT INTO tree_path (ancestor, descendant) VALUES (5, 5); INSERT INTO tree_path (ancestor, descendant) VALUES (6, 6); INSERT INTO tree_path (ancestor, descendant) VALUES (7, 7);
일부 쿼리를 실행
# (ROOT) and subdirectories SELECT f.id, f.dirname FROM filesystem f JOIN tree_path t ON t.descendant = f.id WHERE t.ancestor = 1; +----+---------+ | id | dirname | +----+---------+ | 1 | ROOT | | 2 | Dir2 | | 3 | Dir3 | | 4 | Dir4 | | 5 | Dir5 | | 6 | Dir6 | | 7 | Dir7 | +----+---------+ # Dir3 and subdirectories SELECT f.id, f.dirname FROM filesystem f JOIN tree_path t ON t.descendant = f.id WHERE t.ancestor = 3; +----+---------+ | id | dirname | +----+---------+ | 3 | Dir3 | | 6 | Dir6 | +----+---------+ # Dir5 and parent directories SELECT f.id, f.dirname FROM filesystem f JOIN tree_path t ON t.ancestor = f.id WHERE t.descendant = 5; +----+---------+ | id | dirname | +----+---------+ | 1 | ROOT | | 2 | Dir2 | | 5 | Dir5 | +----+---------+ # Dir7 and parent directories SELECT f.id, f.dirname FROM filesystem f JOIN tree_path t ON t.ancestor = f.id WHERE t.descendant = 7; +----+---------+ | id | dirname | +----+---------+ | 1 | ROOT | | 2 | Dir2 | | 4 | Dir4 | | 7 | Dir7 | +----+---------+ SELECT f.id, f.dirname FROM filesystem f JOIN tree_path t ON t.ancestor = f.id WHERE t.descendant = ( SELECT id FROM filesystem WHERE dirname LIKE '%7%' ); +----+---------+ | id | dirname | +----+---------+ | 1 | ROOT | | 2 | Dir2 | | 4 | Dir4 | | 7 | Dir7 | +----+---------+
-
==============================
2.당신은 ID와 부모 ID를 가지고 각각의 노드의 일련의 계층 적 데이터를 나타냅니다. 당신은이 ID 열 및 개별 디렉토리 이름의 텍스트 하나 DIRTAB라는 테이블에 저장할 수 :
당신은 ID와 부모 ID를 가지고 각각의 노드의 일련의 계층 적 데이터를 나타냅니다. 당신은이 ID 열 및 개별 디렉토리 이름의 텍스트 하나 DIRTAB라는 테이블에 저장할 수 :
ID -- as a primary key PARENT_ID -- refers to the ID of the parent row in DIRTAB DIRNAME -- the text of the name eg Dir5
SQLite는 오라클이 계층 적 데이터를 처리해야하는 CONNECT BY 절을 부족하지만 난 당신이 뭔가 계층에 근접 할 수있는 몇 가지 추한 SQL을 받아 들일 준비하는 경우 생각 :
SELECT (CASE WHEN p5.DIRNAME IS NOT NULL THEN p5.DIRNAME || '/' ELSE '' END) || (CASE WHEN p4.DIRNAME IS NOT NULL THEN p4.DIRNAME || '/' ELSE '' END) || (CASE WHEN p3.DIRNAME IS NOT NULL THEN p3.DIRNAME || '/' ELSE '' END) || (CASE WHEN p2.DIRNAME IS NOT NULL THEN p2.DIRNAME || '/' ELSE '' END) || (CASE WHEN p1.DIRNAME IS NOT NULL THEN p1.DIRNAME || '/' ELSE '' END) || p0.DIRNAME as FULLPATH FROM DIRTAB p0 LEFT OUTER JOIN DIRTAB p1 ON p1.ID = p0.PARENT_ID LEFT OUTER JOIN DIRTAB p2 ON p2.ID = p1.PARENT_ID LEFT OUTER JOIN DIRTAB p3 ON p3.ID = p2.PARENT_ID LEFT OUTER JOIN DIRTAB p4 ON p4.ID = p3.PARENT_ID LEFT OUTER JOIN DIRTAB p5 ON p5.ID = p4.PARENT_ID WHERE p0.DIRNAME = 'Dir6'
여기에서 문제는 당신이 디렉토리 구조의 최대 깊이를 예측하고 대처하기 위해 SQL 문을 확대해야한다는 것입니다. 내가 예를 들어 6 단계를 수행했다. 또한 나는 SQLite는 빈 문자열을 연결 아무런 문제가 없다고 가정하고있다. (일부 데시벨은 널 (null)로 처리하고 null로 전체 표현식의 결과를 변환)
-
==============================
3.난 당신이 방법을 수정 caled 예약 주문 트리 순회에 대해 읽어해야한다고 생각 : http://www.sitepoint.com/hierarchical-data-database/
난 당신이 방법을 수정 caled 예약 주문 트리 순회에 대해 읽어해야한다고 생각 : http://www.sitepoint.com/hierarchical-data-database/
인접성 목록 모델과 수정 된 예약 주문 트리 탐색 알고리즘 : 관계형 데이터베이스에 계층 적 데이터를 저장하는 두 가지 방법에 대한 링크에 나와있는.
수정 된 예약 주문 트리 순회 방법의 주요 아이디어 탐색 및 하위 트리 선택을 auxiliate에 대한 포인터와 주석을 모든 노드입니다 :
from https://stackoverflow.com/questions/6802539/hierarchical-tree-database-for-directories-path-in-filesystem by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왜 DELETE 문에 별칭을 사용할 수 없습니다? (0) | 2020.05.19 |
---|---|
[SQL] 오브젝트 [INFORMATION_SCHEMA]에서 확인할 수없는 기준. TABLES] (0) | 2020.05.19 |
[SQL] 왜 빠른 일괄 삽입 / 업데이트는 무엇입니까? 어떻게 배치 업데이트 작업을? (0) | 2020.05.19 |
[SQL] 쉼표의 차이 조인 분리와 MySQL의 구문에 가입 무엇입니까? [복제] (0) | 2020.05.19 |
[SQL] 어떻게 내 테이블을 잠금되고 있는지 확인하려면? (0) | 2020.05.19 |