Ole: SQL oder Rekursion oder was anderes?

Hallo,

ich überlege grade wie ich folgende Aufgabe am besten löse:

  • 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.
  • Jede Kategorie kann Artikel haben

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-)>

--
Stickstoff eignet sich nicht für Handarbeiten.
  1. 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.

  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. 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

      --
      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  3. 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";

    1. 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-)>

      --
      Stickstoff eignet sich nicht für Handarbeiten.