2011-08-22 12 views
9

No he encontrado ningún ejemplo específico de esto, pero estoy interesado en representar una estructura de directorio completa con actualizaciones, etc. utilizando el tipo de datos hierarchyid. Este es un caso de uso común citado para el hierarchyid pero no puedo encontrar ningún artículo que construya tal ejemplo.Representar sistema de archivos en DB (utilizando hierarchyid en SQL Server 2008)

sólo quiero representar una estructura de directorios enteros tales como:

/dir1 
/file1 
/dir2 
/dir2/dir3 
/dir2/dir3/file2 

** No estoy tratando de sincronizar esto con un sistema de archivos en el disco. Está puramente representado a través de la base de datos. **

+2

¿Cómo esperas para mantener la estructura de la tabla en sincronía con el archivo ¿sistema? Si agrego un archivo en/dir2, ¿qué tan rápido debe saber la tabla al respecto? Inmediatamente, un poco de retraso, ¿nunca? ¿No tendría más sentido leer en la estructura del directorio en tiempo de ejecución? Realmente no necesitaría hierarchyid para eso. –

+0

Gracias, no estoy tratando de mantener el DB sincronizado con el sistema de archivos. Básicamente, actuará como su propio sistema de archivos (los nodos del archivo apuntarán a los archivos en el disco, pero no habrá una estructura de directorio). Todo lo que realmente necesito ayuda es solo esta parte de eso. Gracias. – user8790899800

+0

¿Por qué el comentario de @Aaron Bertrand está siendo votado cuando no es realmente relevante? Parece extraño. – user8790899800

Respuesta

7

Aquí es un ejemplo de lo que representa un sistema de archivos a través hierarchyid:

/* 
Setup: 
- Create the table to hold the files 
- nodeDepth is identifier of the depth for readability 
- fullpath is the full path of the file or directory 
- nodePath is the HierarchyID 
- nodePath identifies the row within the tree 
*/ 

DECLARE @t TABLE (
    nodeID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    nodeDepth VARCHAR(10) NOT NULL, 
    fullPath VARCHAR(20) NOT NULL, 
    nodePath HIERARCHYID NOT NULL 
) 

carga de datos:

/* 
Load the nodePath value with the Parse command: 
- The root node has a single/
- Every nodePath must begin and end with/
- /1/2/ the second item on level 2 
*/ 

INSERT @t (fullPath, nodeDepth, nodePath) VALUES 
('/','1',HIERARCHYID::Parse('/')), 
('/dir1','1.1',HIERARCHYID::Parse('/1/1/')), 
('/file1','1.2',HIERARCHYID::Parse('/1/2/')), 
('/dir2','1.3',HIERARCHYID::Parse('/1/3/')), 
('/dir2/dir3','1.3.1',HIERARCHYID::Parse('/1/3/1/')), 
('/dir2/dir3/file2','1.3.1.1',HIERARCHYID::Parse('/1/3/1/1/')) 

muestran los caminos:

SELECT * 
FROM @t 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
1   1  /     0x 
2   1.1  /dir1    0x5AC0 
3   1.2  /file1    0x5B40 
4   1.3  /dir2    0x5BC0 
5   1.3.1  /dir2/dir3   0x5BD6 
6   1.3.1.1 /dir2/dir3/file2  0x5BD6B0 

Obtener los ancestros de fichero2 (hasta un nivel):

SELECT * 
FROM @t 
WHERE nodePath = 
    (SELECT nodePath.GetAncestor(1) 
    FROM @t 
    WHERE fullPath = '/dir2/dir3/file2') 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- --------- 
5   1.3.1  /dir2/dir3   0x5BD6 

obtener todos Descentants de directorio2:

SELECT * 
FROM @t 
WHERE nodePath.IsDescendantOf(
    (SELECT nodePath 
    FROM @t 
    WHERE fullPath = '/dir2')) = 1 
AND fullPath <> '/dir2' /* Parent is considered its own descendant */ 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
5   1.3.1  /dir2/dir3   0x5BD6 
6   1.3.1.1 /dir2/dir3/file2  0x5BD6B0 

obtener la ruta raíz:

SELECT * 
FROM @t 
WHERE nodePath = HIERARCHYID::GetRoot() 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
1   1  /     0x 

Obtén el nivel l de fichero2:

SELECT nodePath.GetLevel() AS level 
FROM @t 
WHERE fullPath = '/dir2/dir3/file2' 

level 
------ 
4 

Referencias:

Cuestiones relacionadas