복붙노트

[SQL] SQL은 - 어떻게 저장하고 탐색 계층 구조가?

SQL

SQL은 - 어떻게 저장하고 탐색 계층 구조가?

당신이 모델에 사용하고 데이터베이스 계층 정보를 검색하는 방법은 무엇입니까?

해결법

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

    1.이 주제에 결정적인 조각 조 셀코에 의해 작성되었으며, 그는에 smarties에 대한 SQL에서 조 셀코의 나무와 계층 구조라는 책으로 그들의 수를 일했다.

    이 주제에 결정적인 조각 조 셀코에 의해 작성되었으며, 그는에 smarties에 대한 SQL에서 조 셀코의 나무와 계층 구조라는 책으로 그들의 수를 일했다.

    그는 감독 그래프이라는 기술을 선호한다. 이 주제에 대한 자신의 작품에 대한 소개는 여기에서 찾을 수 있습니다

  2. ==============================

    2.나는 수정 된 예약 주문 트리 순회 알고리즘을 좋아합니다. 이 기술은 매우 쉽게 나무를 조회 할 수 있습니다.

    나는 수정 된 예약 주문 트리 순회 알고리즘을 좋아합니다. 이 기술은 매우 쉽게 나무를 조회 할 수 있습니다.

    그러나 여기에 내가 젠드 프레임 워크 (PHP) 참여자의 웹 페이지에서 복사 한 항목에 대한 링크의 목록입니다 (2007년 6월 5일 15시 52분에서 로랑 Melmoux 작성자에 의해이 게시).

    링크의 대부분은 언어 무신론자입니다 :

    데이터베이스와 계층 구조를 표현하기 위해 2 개 주 표현과 알고리즘이 있습니다 :

    그것은 잘 여기에서 설명하는 것 :

    여기에 내가 수집 한 몇 가지 더 많은 링크는 다음과 같습니다

    인접리스트 모델

    중첩 된 세트

    그래프

    클래스 :

    중첩은 DB 트리 ADODB를 설정합니다

    방문 모델 ADOdb의

    PEAR :: DB NestedSet

    배나무

    nstrees

  3. ==============================

    3.SQL 데이터베이스에서 계층 구조를 표현하는 가장 좋은 방법은 무엇입니까? 일반적인 휴대용 기술?

    SQL 데이터베이스에서 계층 구조를 표현하는 가장 좋은 방법은 무엇입니까? 일반적인 휴대용 기술?

    하자의 계층 구조는 대부분 읽기 가정하지만 완전히 고정되지 않습니다. 의는 가족 트리입니다 가정 해 봅시다.

    여기에 그것을하지 않는 방법은 다음과 같습니다

    create table person (
    person_id integer autoincrement primary key,
    name      varchar(255) not null,
    dob       date,
    mother    integer,
    father    integer
    );
    

    그리고이 같은 데이터를 삽입 :

    person_id   name      dob       mother father  
    1           Pops      1900/1/1   null   null  
    2           Grandma   1903/2/4   null   null  
    3           Dad       1925/4/2   2      1  
    4           Uncle Kev 1927/3/3   2      1
    5           Cuz Dave  1953/7/8   null   4
    6           Billy     1954/8/1   null   3
    

    대신, 두 개의 테이블로 노드와의 관계를 분할합니다.

    create table person (
    person_id integer autoincrement primary key,
    name      varchar(255) not null,
    dob       date
    );
    
    create table ancestor (
    ancestor_id   integer,
    descendant_id integer,
    distance      integer
    );
    

    데이터는 다음과 같이 생성된다 :

    person_id   name      dob       
    1           Pops      1900/1/1  
    2           Grandma   1903/2/4   
    3           Dad       1925/4/2   
    4           Uncle Kev 1927/3/3
    5           Cuz Dave  1953/7/8   
    6           Billy     1954/8/1   
    
    ancestor_id  descendant_id  distance
    1            1              0
    2            2              0
    3            3              0
    4            4              0
    5            5              0
    6            6              0
    1            3              1
    2            3              1
    1            4              1
    2            4              1
    1            5              2
    2            5              2
    4            5              1
    1            6              2
    2            6              2
    3            6              1
    

    당신은 지금 당신이 노드와 동일한 행의 계층 관계가있는 경우 일어날 것 자체에 테이블 다시 합류 포함하지 않는 임의의 쿼리를 실행할 수 있습니다.

    누가 조부모있다?

    select * from person where person_id in 
        (select descendant_id from ancestor where distance=2);
    

    귀하의 모든 자손 :

    select * from person where person_id in 
        (select descendant_id from ancestor 
        where ancestor_id=1 and distance>0);
    

    삼촌은 누구인가?

    select decendant_id uncle from ancestor 
        where distance=1 and ancestor_id in 
        (select ancestor_id from ancestor 
            where distance=2 and not exists
            (select ancestor_id from ancestor 
            where distance=1 and ancestor_id=uncle)
        )
    

    당신은 모두에게 하위 쿼리를 통해 자체에 테이블을 결합의 문제를 방지 일반적인 제한은 16 subsuqeries입니다.

    문제는, 상위 테이블을 유지하는 것은 일종의 하드의이다 - 최고의 저장 프로 시저으로 수행.

  4. ==============================

    4.나는 조쉬 동의있어. 당신이 회사의 조직처럼 거대한 계층 구조를 사용하는 경우 어떤 일이 발생. 사람들은 / 조인 큰 문제가 될 것 "거리"를 유지 ... 회사 변경보고 라인 등을두고 당신은 두 개의 데이터 테이블을 유지 보수해야 할 수 있습니다.

    나는 조쉬 동의있어. 당신이 회사의 조직처럼 거대한 계층 구조를 사용하는 경우 어떤 일이 발생. 사람들은 / 조인 큰 문제가 될 것 "거리"를 유지 ... 회사 변경보고 라인 등을두고 당신은 두 개의 데이터 테이블을 유지 보수해야 할 수 있습니다.

    이 쿼리 (SQL Server 2005 및 위)는 사람의 전체 라인을 참조 및 계층 구조에서 자신의 위치를 ​​계산하고 단지 사용자 정보의 단일 테이블을 필요로 할 것이다. 자식 관계를 찾아 수정할 수 있습니다.

    --Create table of dummy data
    create table #person (
    personID integer IDENTITY(1,1) NOT NULL,
    name      varchar(255) not null,
    dob       date,
    father    integer
    );
    
    INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);  
    INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
    INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
    INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
    INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
    INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);
    
    DECLARE @OldestPerson INT; 
    SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family
    
    WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
    (
       SELECT
          personID
          ,Name
          ,dob
          ,father,
          1 as HierarchyLevel
       FROM #person
       WHERE personID = @OldestPerson
    
       UNION ALL
    
       SELECT
        e.personID,
          e.Name,
          e.dob,
          e.father,
          eh.HierarchyLevel + 1 AS HierarchyLevel
       FROM #person e
          INNER JOIN PersonHierarchy eh ON
             e.father = eh.personID
    )
    
    SELECT *
    FROM PersonHierarchy
    ORDER BY HierarchyLevel, father;
    
    DROP TABLE #person;
    
  5. ==============================

    5.참고 : 상황의 종류에 대한 SQL Server 2008을 소개하고 새로운 HIERARCHYID 데이터 유형입니다. 당신이 당신의 행이 수평뿐만 아니라 수직으로 앉아 어디 "나무"에서 제어 할 수 있습니다.

    참고 : 상황의 종류에 대한 SQL Server 2008을 소개하고 새로운 HIERARCHYID 데이터 유형입니다. 당신이 당신의 행이 수평뿐만 아니라 수직으로 앉아 어디 "나무"에서 제어 할 수 있습니다.

  6. ==============================

    6.오라클 : SELECT ... START WITH ... CONNECT BY

    오라클 : SELECT ... START WITH ... CONNECT BY

    오라클은 쉽게 트리 기반의 검색을 허용하는 SELECT하는 확장자를 갖습니다. 아마도 SQL 서버는 일부 유사한 확장이?

    이 쿼리는 중첩 관계는 부모와 자식 컬럼에 저장되어있는 테이블을 통과합니다.

    select * from my_table
        start with parent = :TOP
        connect by prior child = parent;
    

    http://www.adp-gmbh.ch/ora/sql/connect_by.html

  7. ==============================

    7.조쉬 마크 해리슨에 의해 사용되는 기술의 혼합을 좋아한다 :

    조쉬 마크 해리슨에 의해 사용되는 기술의 혼합을 좋아한다 :

    두 테이블, 사람의 데이터를 하나는 hierarchichal 정보와 기타 (person_id로, PARENT_ID [mother_id])이 테이블의 PK가 person_id로되어있는 경우, 당신은에서 의미가 노드에 의해 하나의 부모 (함께 간단한 나무가 있지만 다른 경우) 계정 회계와 같은이 경우

    이 계층 구조 테이블은 재귀 절차에 의해 transversed 또는 DB는 SELECT와 같은 문장으로 지원하는 경우 ... PRIOR (오라클) BY 할 수 있습니다.

    당신은 당신이 mantain하려는 계층 구조 데이터의 최대 깊이는 계층 구조의 레벨 당 열 집합에 하나의 테이블을 사용하는 것입니다 알고있는 경우에 다른있는 posibility입니다

  8. ==============================

    8.우리가 나무의 구성 요소를 구현 할 때 우리는 같은 문제가 있었다 [fleXive]와 MySQL의 문서에서 tharkun 언급 중첩 된 세트 트리 모델 접근 방식을 사용했다.

    우리가 나무의 구성 요소를 구현 할 때 우리는 같은 문제가 있었다 [fleXive]와 MySQL의 문서에서 tharkun 언급 중첩 된 세트 트리 모델 접근 방식을 사용했다.

    속도 일 (크게) 우리는 단순히 우리가 우리 모두 왼쪽과 오른쪽 값을 다시 계산하지 않고 삽입 및 이동 노드 수를 잘 경계 최고 수준의 최대 긴 값을 사용하는 의미 퍼져 접근 방식을 사용까지뿐만 아니라. 값 좌우 신규 노드에 대한 경계로 내주 제 3 싶게를 사용하여 노드의 범위를 분할함으로써 계산된다.

    자바 코드 예제는 여기에서 볼 수 있습니다.

  9. ==============================

    9.당신은 SQL 서버 2005을 사용하는 경우,이 링크는 계층 적 데이터를 검색하는 방법에 대해 설명합니다.

    당신은 SQL 서버 2005을 사용하는 경우,이 링크는 계층 적 데이터를 검색하는 방법에 대해 설명합니다.

    당신이 그들을 사용하여 편안 일단 공통 테이블 식 (열팽창 계수)는 친구가 될 수 있습니다.

  10. from https://stackoverflow.com/questions/38801/sql-how-to-store-and-navigate-hierarchies by cc-by-sa and MIT license