![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Benutzer Registriert seit: 05.12.2005
Beiträge: 62
|
Hallo, ich hab eine Tabelle (wow!) in der sowas wie Verzeichnisse gespeichert sind. Die Tabelle hat etwa folgenden Inhalt: ID NAME PARENT_ID --------------------------- 1 Verzeichnis 1 0 2 Verzeichnis 2 0 3 Verzeichnis 3 1 4 Verzeichnis 4 1 5 Verzeichnis 5 1 6 Verzeichnis 6 2 7 Verzeichnis 7 0 8 Verzeichnis 8 4 ... PARENT_ID = 0 bedeutet hier, dass dieses Verzeichnis quasi im ROOT-Verzeichnis liegt, also kein Verzeichnis als "Vater" hat. Verzeichnisse im ROOT sind also Verzeichnis 1, 2 und 7. Verzeichnis 3, 4 und 5 liegen innerhalb von Verzeichnis 1, Verzeichnis 6 in Verzeichnis 2, Verzeichnis 8 in 4 usw. also ganz einfach... Nun möchte ich - wenn möglich in einer Abfrage eine Verzeichnisliste in etwa der Form Code: Verzeichnis 1
Verzeichnis 3
Verzeichnis 4
Verzeichnis 8
Verzeichnis 5
Verzeichnis 2
Verzeichnis 6
Verzeichnis 7
...
haben. Ich hab nur leider keine Schimmer, wie ich an die Sache rangehen sollte... Habt ihr vll. irgend eine Idee? BTW: Ich benutze (immernoch) MySQL 4.1.10 Bin für jeden Hint dankbar Lg sayang |
| | |
| | Nach oben #3 |
| Blubb... öfz Registriert seit: 16.03.2006 Ort: Berlin
Beiträge: 419
|
Das wäre die einfachste Lösung, aber auch der Tod für jeden Ressourcenarmen Server... Nur weiß ich selber auch keine bessere Lösung als ne andere Struktur (Baumstruktur mit Knoten...) Ist aber wesentlich umständlicher!
__________________ Vive la France! Welcome to Sarkoworld... |
| | |
| | Nach oben #4 |
| Gast
Beiträge: n/a
|
...ich würde die Verzeichnisse, die eine Parent_ID haben, schon einmal grundsätzlich in eine eigene Tabelle auslagern. Die Spalte Parent-ID bei der ersten Tabelle, welche die Haupt-Verzeichnisse enthält, entfällt dann. Stichwort "normalisierung" Das Ganze fragst Du dann über ein Join ab. Geändert von flupsi (14.08.2006 um 13:06 Uhr). |
|
| | Nach oben #5 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 521
| Zitat:
eine alternative zu parent_id zur abbildung von bäumen sind sogenannte nested sets
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
| | Nach oben #6 |
| Gast
Beiträge: n/a
|
wenn, wenn, wenn.... gehe ich von dem Modell aus, welches oben angezeigt wird, ist es schon sinnvoll. Natürlich gibt es kein Patentrezept. Es kommt nicht nur auf die Tiefe der Verschachtelung an, sondern auch darauf, wieviele Verzeichnisse insgesamt in der Tabelle landen sollen / werden. ....das weiss aber nur Sayang allein |
|
| | Nach oben #7 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 521
| Zitat:
natürlich kommt es letztendlich darauf an, ob es ein tief verschachtelter baum ist und ob viele änderungen daran durchgeführt werden.
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
| | Nach oben #8 | ||
| Gast
Beiträge: n/a
| Zitat:
Wenn Du mich schon immer verbessern must, dann lies doch bitte meine Postings richtig durch. Zitat:
| ||
|
| | Nach oben #9 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Ihr habt da noch was vergessen: [/Kindergarten] Zum Thema Normalisierung wüsste ich gerade nicht, ob es dieser entsprechend verstößt in einer Tabelle auf die selbe Tabelle einen Fremdschlüssel zu legen, das müsste ich in der Tat nachlesen - wenn ich irgendwann mal die Zeit dazu habe. Aebr ich will euch ja lieber beide demütigen (bitte nicht ernst nehmen Eine Tabelle mit den Verzeichnissen ohne die Spalte Parent_ID und eine Tabelle mit 2 Spalten: Parent_ID und Child_ID. Ha, nun hab ich es euch aber gezeigt, endlose Tiefen und das in der gewünschten 2-Tabellen-Normal-Form
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #10 |
| Benutzer Registriert seit: 05.12.2005
Beiträge: 62
|
So... erstmal vielen Dank für die Tipps... ich hab jetzt irgendwie aus allem etwas entnommen Tabelle 'folder': ID NAME ---------------- 1 Verzeichnis 1 2 Verzeichnis 2 3 Verzeichnis 3 4 Verzeichnis 4 5 Verzeichnis 5 6 Verzeichnis 6 7 Verzeichnis 7 8 Verzeichnis 8 Tabelle 'foldermapping' ID PARENT ---------- 1 0 2 0 3 1 4 1 5 1 6 2 7 0 8 4 Dann hab ich mit SELECT f.id, f.name, m.parent FROM folder f, foldermapping m WHERE f.id=m.child ORDER BY m.parent, f.name eine Liste bekommen, die nach der Parent-ID sortiert war. Diese Items hab ich nach und nach eingelesen, Folder-Objekte erzeugt, diese mit ihrer ID als Schlüssel in eine Hashmap (die brauch ich nur zum aufbau) gepackt. Die Folder-Objekte selbst verfügen über eine Collection, in der die Subfolder gespeichert werden können. Code: HashMap foldermap = new HashMap();
Folder root = new Folder("");
foldermap.put(new Integer(0), root);
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
String output = "";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://"
+ host + "/" + db + "?user=" + user + "&password=" + pass);
stmt = conn.createStatement();
rs = stmt.executeQuery(
"SELECT f.id AS id, f.name AS name, m.parent AS parent " +
"FROM link_folders f, link_foldermapping m " +
"WHERE f.id=m.child ORDER BY m.parent, f.name");
//int i = 0;
while (rs.next()) {
int f_id = rs.getInt("id");
String name = rs.getString("name");
int p_id = rs.getInt("parent");
Folder tmp = new Folder(name);
foldermap.put(new Integer(f_id), tmp);
Folder parent = (Folder)foldermap.get(new Integer(p_id));
parent.addSubFolder(tmp);
//i++;
}
Code: private void listFolders(Folder root, String intend, PrintWriter out) {
out.println(intend+root.getFolderName()+"<br/>");
Folder[] subfolders = root.getSubFolders();
for(int i=0; i<subfolders.length; i++) {
listFolders(subfolders[i], intend+" ", out);
}
}
sayang |
| | |
| | Nach oben #11 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Ähm, nur zur Info: Bei Verzeichnissen, die im Root liegen, macht ein Eintrag in der Tabelle 'foldermapping' keinen wirklichen Sinn. Du kannst sie einfach weglassen, sodass nur dann ein Datensatz in der Tabelle gefunden wird, wenn auch wirklich einer da sein muss. Allerdings sollte dann aus: Code: "SELECT f.id AS id, f.name AS name, m.parent AS parent " +
"FROM link_folders f, link_foldermapping m " +
"WHERE f.id=m.child ORDER BY m.parent, f.name");
Code: "SELECT f.id AS id, f.name AS name, m.parent AS parent " +
"FROM link_folders f" +
"LEFT OUTER JOIN link_foldermapping m ON f.id=m.child" +
"ORDER BY m.parent, f.name");
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #12 |
| Benutzer Registriert seit: 05.12.2005
Beiträge: 62
|
Das Objekt für den root Folder lege ich quasi manuell an. Von daher ist dafür kein Eintrag in der Tabelle vorhanden. Die Hashmap brauch ich doch um nachzusehen, ob für einen Folder aus der DB bereits vorher ein entsprechender parent Folder eingelesen wurde und diesem parent Folder sein Kind "vorzustellen". Eine Sortierung nach dem Foldername ist - bei mir - nicht unbedingt sinnvoll, da es ja dann vorkommen kann, dass ich einen Folder aus der DB bekomme, der einen bestimmten parent Folder hat, welcher jedoch noch nicht ausgelesen wurde. Naja, ist halt eine Quick&Dirty-Lösung. Werd mir heut nachmittag aber mal dein SQL Statement genauer ansehen... BTW: kennt ihr ne gute Seite, wo das mit den JOINs mal so richtig für Doofe erklärt wird? Lg sayang |
| | |
| | Nach oben #13 | |||
| Gast
Beiträge: n/a
| Zitat:
Zitat:
Wenn sie per "auto_increment" erstellt werden, könnte Deine Aufteilung so vielleicht Probleme im Handling aufwerfen... Ich weiss ja nicht, ob sich die Verzeichnissnamen auch mal ändern, oder sie verschoben werden können... Zitat:
Mir persönlich geht es meist so, dass eine Seite allein es fast nie schafft, mir etwas zu erklären. Erst nachdem ich mir die Schreibstile und Einzelheiten verschiedener Seiten angetan habe, blitzt dann das Verstehen in meinen Augen auf Kannst ja vielleicht mal hier anfangen: http://www.sql-und-xml.de/sql-tutori...-mit-join.html | |||
|
| | Nach oben #14 |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 521
|
is ja toll, dass jetzt alles klappt. aber mal ne zwischenfrage: was bringt es denn, die beziehungen zwischen den einzelnen elementen in foldermappings auszulagern, außer dass noch eine weitere tabelle angelegt wird... btw: leg dir ne oracle datenbank zu. da kann man bäume direkt speichern
__________________ Weißt Bescheid - Scheiß wie weit |
| | |
| | Nach oben #16 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 521
| Zitat:
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| SQL, Zahlen auf zwei Stellen mit Nullen auffüllen, vgl. sprintf() | Ben | Datenbanken | 8 | 21.04.2007 19:32 |
| Abkürzung des Wochentags in SQL, vgl. strftime in PHP | Ben | Datenbanken | 4 | 12.04.2007 16:51 |
| Zugriff auf Wert des vorhergenden Datensatzes in einer SQL Abfrage | Jay | Datenbanken | 5 | 17.07.2006 15:25 |
| sql query where .... browse array | juergreh | PHP-Programmierung | 6 | 13.05.2006 09:49 |
| Probleme mit Variable in SQL Anweisung | Doggi | Datenbanken | 10 | 15.12.2005 14:04 |