Hierarchical/tree database for directories path in filesystem

后端 未结 3 1807
暖寄归人
暖寄归人 2020-11-30 22:05

I want to store the directories (present on the disk) into a database, maintaining their hierarchical/tree structure.

Here\'s a figure:

                           


        
3条回答
  •  旧巷少年郎
    2020-11-30 22:43

    You represent hierarchical data as a series of nodes each of which has an ID and a Parent ID. You could store your in a table called DIRTAB with 2 ID columns and one for the text of the individual directory name:

    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 lacks the CONNECT BY clause that Oracle has to process hierarchical data but I think if you're prepared to accept some ugly SQL you can approximate something hierarchical:

    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'  
    

    The trouble here is that you have to anticipate the maximum depth of you directory structure and expand the SQL statement to cope. I have done 6 levels as an example.
    Also I'm assuming that SQLite has no problem concatenating empty strings. (Some DBs treat them as null and convert the whole expression result to null)

提交回复
热议问题