복붙노트

[SQL] 파일 시스템의 디렉토리 경로 계층 / 트리 데이터베이스

SQL

파일 시스템의 디렉토리 경로 계층 / 트리 데이터베이스

나는 그들의 계층 / 트리 구조를 유지, 데이터베이스에 디렉토리 (디스크에 존재)을 저장할.

여기에 그림입니다 :

                         (ROOT)
                       /        \ 
                    Dir2        Dir3
                   /    \           \
                 Dir4   Dir5        Dir6
                 /          
               Dir7

나는 SQLite 데이터베이스를 사용하고 있습니다.

저를 제안하십시오 :

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.난 당신이 방법을 수정 caled 예약 주문 트리 순회에 대해 읽어해야한다고 생각 : http://www.sitepoint.com/hierarchical-data-database/

    난 당신이 방법을 수정 caled 예약 주문 트리 순회에 대해 읽어해야한다고 생각 : http://www.sitepoint.com/hierarchical-data-database/

    인접성 목록 모델과 수정 된 예약 주문 트리 탐색 알고리즘 : 관계형 데이터베이스에 계층 적 데이터를 저장하는 두 가지 방법에 대한 링크에 나와있는.

    수정 된 예약 주문 트리 순회 방법의 주요 아이디어 탐색 및 하위 트리 선택을 auxiliate에 대한 포인터와 주석을 모든 노드입니다 :

  4. from https://stackoverflow.com/questions/6802539/hierarchical-tree-database-for-directories-path-in-filesystem by cc-by-sa and MIT license