Menü aus Datenbankeinträgen aufbauen

Hallo zusammen,

Ich möchte für meine Website die Inhalte eines von mir anzugebenen Verzeichnisses auslesen und in eine Datenbank schreiben. Das ganze zu realisieren ist kein Problem.

Jedoch habe ich eine Frage: Wie weit sollte ich die zu erstellenden Tabellen normalisieren, um danach sinnvoll per PHP ein Menü daraus zu bauen?

Zur Veranschaulichung ein Beispiel:

Ich nehme folgende Struktur:

/Ordner/Fotos/Urlaubsfotos/Kanada
/Ordner/Fotos/Urlaubsfotos/Kanada/2010
/Ordner/Fotos/Urlaubsfotos/Kanada/2011
/Ordner/Fotos/Urlaubsfotos/Kanada/2011/Woche1

Wäre es nun sinnvoll für jeden Unterordner eine eigene Tabelle per MySQL anzulegen und diese jeweils mit der zu verbinden, die den darüber gelagerten Ordner abbildet? Wenn nicht, wieso?
Ich würde ungern gegen Grundgedanken der Datenbankentwicklung verstoßen, deswegen frage ich vorher nach anderen Meinungen.

Vielen Dank im Voraus und LG,
Hase

hi, ich würde es ungefähr so machen:

ID | Name | IstUnterordnerVon

1 | Root | NULL
2 | Ord1 | 1
3 | Ord2 | 1
4 | SO1 | 2
5 | SO2 | 2

DIe letzte Spalte kann null sein - der oberste ordner. ansonsten steht in IstUnterordnerVon ein Wert drin, der in ID vorkommt.

das beispiel von oben:

/
/Ord1/
/Ord1/SO1/
/Ord1/SO2/
/Ord2/

gruß
emil

Vielen Dank für die Antwort, Emil.

Jetzt stellt sich mir nur noch die Frage, wie ich die ausgelesenen Dateien aus den Ordnern in die Struktur mit unterbringe.

Nehmen wir an im Ordner

/Ordner/Fotos/Urlaubsfotos/Kanada/2011/Woche1

lägen die Dateien BildA.jpg und BildB.jpg. Wäre ich dann mit deiner Lösung dafür nicht auf eine zusätzliche Tabelle angewiesen, in die ich alle ausgelesenen Dateien mit Gesamtpfad speichere? Ich würde darauf verzichten wollen, das Pfad-Auslese-Script bei jedem Seitenaufruf ausführen zu müssen, wenn das möglich ist.

Viele Grüße und Danke nochmal,
Hase

nunja, eine möglichkeit wäre das anlegen einer zweiten tabelle

ID | Dateiname | IstInOrdner

IstInOrdner enthält dann eine ID von der 1. Tabelle. so kämst du insgesamt auf 2 tabellen.

eine andere möglichkeit wäre es, in der ersten tabelle noch eine spalte wie IstDatei mit einem ja/nein-wert anzulegen - wenn bei einem unterordner dann in dieser spalte eine 1 vermerkt ist, behandelst du es wie eine datei.

ich persönlich finde die erste möglichkeit allerdings sehr viel eleganter, und was macht schon eine tabelle mehr?

Eine Tabelle mehr macht in der Tat gar nichts aus. Ich wollte nur sicherstellen, Deine Antwort richtig verstanden zu haben.
Die Alternative, die ich im Kopf hatte, hätte etliche Tabellen mehr vorgesehen, von daher ist diese eine eher unbedeutend.

Vielen Dank für deine Meinung, ich werde mich in nächster Zeit mal an der Umsetzung dessen versuchen, was Du mir vorgeschlagen hast. Ich werde berichten.

Schau dir auch mal Nested Sets an.
Damit lässt sich die Verzeichnisstruktur einfach nachbilden. Nachteil: Sehr umständlich beim Bearbeiten. Habe dafür allerdings eine Klasse geschrieben, die das erheblich vereinfacht.
Falls Interesse besteht, lade ich sie mal hoch.

Eine sehr nette Alternative, hummer. Da ich mich auch mit den nested Sets befassen möchte, obwohl die Komplexität meines Projekts dem nicht zwangsläufig Rechnung trägt, würde ich Dich bitten, die von Dir angesprochene Klasse auch noch hochzuladen.

Vielen Dank soweit. Der Artikel ist wirklich sehr interessant. :slight_smile:

Die Klasse basiert auf PDO!
NestedSets.class:
hummer.bplaced.net/NestedSets.class.php.txt

Beispiel:

[code]<?php
/*
SQL Tabellenstruktur Beispiel:

CREATE TABLE IF NOT EXISTS navigation (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
lft int(11) NOT NULL,
rgt int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

// Engine sollte InnoDB sein, damit Transaktionen funktionieren.

*/

// Klasse einbinden
require_once ‘NestedSets.class.php’;

// DB-Daten
$dsn = ‘mysql:dbname=testdb;host=localhost’;
$user = ‘dbuser’;
$password = ‘dbpass’;

// PDO-Instanz
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Verbindung fehlgeschlagen: ’ . $e->getMessage();
}

// Tabelle = navigation
$tbl = ‘navigation’;

// Beispiel IDs
$parentId = 1;
$elementId = 3234;

$ns = new NestedSets($dbh, $tbl);

// Kind hinzufügen
$ns->addChild($parentId, ‘Kind 01’);

// Element löschen
$ns->removeParent($elementId);

// Elemente inkl. Kinder löschen
$ns->removeElement($elementId);

// Element nach links/hoch schieben
$ns->moveLeft($elementId);

// Element nach rechts/unten schieben
$ns->moveRight($elementId);

// Baum als Array
print_r($ns->getTree());

// Breadcrumb
print_r($ns->breadCrumb());

// unsortierte HTML Liste
echo $ns->getUl();

// sortierte HTML Liste (jQuery nestedSortable)
echo $ns->getSortableOl();

?>[/code]