SQL oder Rekursion oder was anderes?
Ole
- datenbank
Hallo,
ich überlege grade wie ich folgende Aufgabe am besten löse:
Ich habe in meiner Datenbank (mySQL 5) 3 Tabellen
Kategorien
Artikel
rel_kategorien_artikel
Aufbau Kategorien:
ID
kat_name
parent (bezieht sich auf ID, ist 0 wenn eine Hauptkategorie vorliegt)
is_kat (1/0)
freigegeben (1/0)
Aufbau Artikel:
ID
inhalt
datum (timestamp)
freigegeben (1/0)
archiviert (1/0)
Aufbau rel_kategorien_artikel
kat_id (bezieht sich auf kategorien.id)
art_id (bezieht sich auf artikel.id)
Als serverseitige Sprache steht mir CFML (ColdFusion) zur Verfügung.
Mein Wissen über SQL zeigt mir zur Zeit keine Möglichkeit dieses Problem damit zu lösen.
Ich schaffe es zwar mir mittels INNER JOIN zu einer einzelnen Kategorie die zugehörigen Artikel zusammenzusuchen, jedoch sehe ich mit meinem aktuellen Wissensstand keine Möglichkeit mich durch den virtuellen Kategorien-Baum zu hangeln.
Ich könnte das ganze auch mittels eines Scripts durch Rekursion realisieren. Das wäre zur Zeit die einzige Möglichkeit die mich mit meinem Wissensstand zur Lösung der Aufgabe bringen würde.
Kann ich das ganze vieleicht auch auf Datenbankebene lösen? Damit habe ich bisher noch nicht gearbeitet und deshalb auch keinen Überblick über die Möglichkeiten und deren Realisierung, würde dieses Vorgehen, sollte es möglich sein, aber am performatesten halten.
Wie mache ichs am besten? Was ist möglich?
Btw. Das ganze ist für ein Portal, daß dazu ausgelegt sein soll in Zukunft mehrere tausend Anfragen am Tag (und noch viele zehntausend mehr, wenns nach dem Kunden ginge :)) zu verarbeiten.
Danke
Ole
(8-)>
aus performance technischer sicht, scheint eine reine sql lösung, welche die rekursion abfackelt, das beste.
rekursion innerhalb von datenbanken ist möglich. das läuft zwar auch auf ein abarbeiten des baumes aus, bleibt aber innerhalb der db-engine.
dies setzt aber die möglichkeiten für die jeweilige db-engine voraus (z.b. stored proceedure, welche sich selbst aufruft oder schleife in einer geschachtelten).
du kannst aber auch im programm außerhalb der db-engine den baum durchlaufen und einzelne selects an den db-server geben. hierfür müssen alle 3 tabellen per inner join verbunden werden.
allerdings kann die datenmenge auch einen einfluß haben. ich würde daher beide varianten mit sinnvollen datenmengen vergleichen.
Hello,
Rekursion und SQL schließen sich eigentlich gegenseitig aus, es sei denn, die DBM könnte es alleine bewerkstelligen. Die Rekursion durch das API bei der DBM durchzusetzen, sollte man möglichst vermeiden. Die SQL-Kosten können sich sondt leicht vertausendfachen.
Durch geeigneten Satzaufbau und Beschränkung der Ebenenbreite (Nummernkreis beschränken) kann man ggf. auch vollkommen ohne Rekursion auskommen.
-----
Ich habe da mal im letzten Jahr ein paar Tools angefangen für eine Forensoftware. Bis auf einige Kleinigkeiten funktionierten die schon ganz gut. Kleinigkeiten dauern leider aber am längsten. Leider haben sie mir die Rechner gekluat, auf denen die (fast fertige) Toolbox und die Sicherung waren. Die Agentur ist seitdem auch dicht :-((
Aber ich habe noch einen ganzen Ordner mit Aufzeichnungen. Wenn ich Zeit habe, tippe ich die wichtigsten Sachen nochmal ein und mache es fertig.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi Tom,
Rekursion und SQL schließen sich eigentlich gegenseitig aus, es sei denn, die DBM könnte es alleine bewerkstelligen. Die Rekursion durch das API bei der DBM durchzusetzen, sollte man möglichst vermeiden.
könntest du mir das mal etwas genauer erläutern? Ich weiß, dass zumindest die großen 2 (Oracle und IBM), wenn nicht die großen 3 (inkl. SQL-Server 2005) die Formulierung rekursiver SQL-Abfragen zulassen (=virtuelle Tabelle mit allen ermittelten Datensätzen).
MfG
Rouven
echo $begrüßung;
- Auf einer Seite sollen die aktuellsten, freigegebenen und nicht archivierten Artikel aus 5 freigegebenen Hauptkategorien nebst freigegebenen Unterkategorien dargestellt werden.
- Hauptkategorien können Unter-, Unterunter-, etc. Kategorien (beliebige Tiefe) haben.
Auch für dich könnte die Lösung "Nested Sets" heißen. Die Baumstruktur ist zwar aufwendiger zu plegen, dafür können aber komplette (Teil-)Bäume mit einem einzigen SQL-Statement abgefragt werden.
Ein paar Links:
http://www.develnet.org/36.html
http://www.klempert.de/php/nested_sets/ (PHP, aber vielleicht kannst du es ja trotzdem verstehen. Wenn nicht, dann ist sicher der Abschnitt Literatur nicht uninteressant.)
echo "$verabschiedung $name";
Hi
Das ist mal ne Menge Stoff :)
Hab ich übers Wochenende mal was zu lesen ;)
Danke, auch an die anderen beiden
so long
Ole
(8-)>