Árbol de directorios

hadrien
24 de Enero del 2008
Hola!
Soy algo nuevo con MySQL y estoy trabajando en un Catálogo de Ficheros con MySQL y Python. Como en la mayoriá de consultas sólo queremos saber el directorio inmediatamente superior o inferior de un directorio dado (y en algún caso en que no es así se puede navegar para arriba de forma relativamente fácil), he elegido la siguiente estructura con una relación uno a muchos (y de forma similar con las tablas de ficheros, 1 directorio tiene muchos ficheros):

CREATE TABLE directory (
iddir INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
idFather INTEGER NOT NULL DEFAULT 0,
dname VARCHAR(128) NOT NULL,
PRIMARY KEY(iddir),
INDEX pare(idFather)
) TYPE=InnoDB;

Pero tal y como yo lo veo, de e sta forma, si dname no es UNIQUE, podemos tener muchos subdirectorios con el mismo nombre en un mismo directorio, y si dname es UNIQUE, todos los nombres de directorios deberán ser distintos. No obstante, creo que un que un directorio puede estar en diferentes directorios padres (es decir, el nombre se puede repetir en dirferentes directorios) así que he pensado una nuva estructura con una relación muchos a muchos (algo así):

CREATE TABLE directory (
iddir INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
idFather INTEGER NOT NULL DEFAULT 0,
dname VARCHAR(128) NOT NULL,
PRIMARY KEY(iddir),
INDEX pare(idFather)
) TYPE=InnoDB;

CREATE TABLE dir_has_dir (
iddir INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
idFather INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY(iddir, idFather),
INDEX father(idFather),
INDEX dir(iddir),
FOREIGN KEY(iddir) REFERENCES directory(iddir),
FOREIGN KEY(idFather) REFERENCES directory(idFather)
) TYPE=InnoDB;

Pero me pregunto si esta podría ser la solución o bien si hay otra forma de resolverlo sólo con la tabla de directorios. Incluso alguien me ha sugerido que necesito una estructura de árbol completo, pero eso complicaría mucho las cosas y no sé si de verdad es necesario.

¡Muchas gracias!

hadrien
24 de Enero del 2008
Me "autorespondo"... El nuevo esquema pensado daba el mismo problema. Creo que la solución radica en crear un índice compuesto con el nombre del directorio y el índice del directorio padre.