Wir basteln uns ein Blog - Teil 2

Was an Navigationshilfen üblicherweise in Blogs vorhanden ist, wird ab einer gewissen Menge an Inhalten diesen nicht mehr gerecht. Die Themenauswahl entspricht lediglich einer einzigen Ebene in einer Baumstruktur und da hilft es auch nicht weiter, dass man einen Artikel mehreren Themen zuordnen kann.

Unterstützend gibt es zwar nette Kalender-Tools, doch mal ehrlich: Wer einen Artikel sucht, wird sich in aller Regel den Inhalt in groben Zügen gemerkt haben, jedoch weniger das Datum der Veröffentlichung, sofern es nicht erst drei Tage her ist. Wer sich seine Web-Statistiken mal genauer anschaut, wird feststellen, dass so gut wie kein Besucher im Kalender navigiert.

Noch schlimmer sind Tag Clouds. Was für eine fürchterliche Krücke, die doch letztendlich nichts anderes ist, als eine weitere Navigation nach Themen oder Stichwörtern. Was kann eine Tag Cloud, was eine Themenliste nicht kann? Sie kann sich stellenweise aufplustern, um vermeintlich wichtige Stichwörter optisch hervorzuheben. Doch woher weiß die Wolke, was ich lesen will? Vielleicht interessiert mich ja gar nicht, was alle anderen lesen. Vielleicht ist das Stichwort, nach dem ich suche, so klein, dass ich es in der Buchstabensuppe nicht finde.

Dabei ist der ideale Ansatzpunkt eigentlich schon in jedem Blog vorhanden: Die Möglichkeit, einen Artikel mehreren Themen zuzuordnen. Was wäre, wenn man als Leser ebenfalls mehrere Themen miteinander verknüpfen könnte, um Schnittmengen zu erzeugen? Hier ein kleines Beispiel:

Ein Blog hat 1000 Artikel, die 10 verschiedenen Themen zugeordnet sind. Wäre jeder Artikel nur einem einzigen Thema zugeordnet, würden pro Thema statistisch gesehen 100 Artikel aufgelistet werden. Viele Artikel wurden aber mehr als einem Thema zugeordnet. Könnte man jetzt alle Artikel anzeigen lassen, die einem Thema A und einem Thema B zugeordnet sind, hätten wir vermutlich eine Schnittmenge von nur noch 10 Artikeln. Das sieht doch schon viel übersichtlicher aus.

Spätestens bei einer Zuordnung zu 3 Themen könnte man so zielgerichtet Artikel aus einem Pool von mehreren Tausend herausfischen. Kombinieren wir das noch mit der obligatorischen Volltextsuche, hat kein Artikel mehr die Chance, sich zu verstecken.




Technischer Teil:

Der erste Augenmerk gilt einem aussagekräftigen, sprechenden URL. Bei einem Thema ist das noch recht einfach, da ein Thema ja in einer eigenen Hierarchie-Ebene abgebildet werden kann:

http://blog.de/themen/thema1

Mehrere Themen untereinander würden hingegen zu einer unterschiedlichen Wertigkeit der Begriffe führen:

http://blog.de/themen/thema1/thema2

Wir wollen hingegen eine Gleichwertigkeit erlangen und müssen uns konsequenterweise auf eine Ebene beschränken. Ein gut lesbarer und gedanklich schlüssiger URL wäre daher

http://blog.de/themen/thema1+thema2

Das ganze muss natürlich wieder aufgedröselt werden, damit wir eine Abfrage schaffen können, die uns alle Artikel auflistet, die thema1 und thema2 zugeordnet sind.

Um unser PHP-Script die einzelnen Themen ermitteln zu lassen, müssen wir also den übermittelten URL wieder zerlegen. Mittels explode() erzeugen wir aus den Themen ein Array, das in einer Schleife ausgelesen wird und unseren Abfrage-String aufbaut.

Eine kleine Schwierigkeit besteht in der Verknüpfung zwischen Artikel und Thema, die nun auch im String mehrfach erfolgen muss. Ausgangsbasis ist

  • eine Tabelle „Artikel“,
  • eine Tabelle „Themen“ und
  • eine Tabelle „Zuordnung“.

In der Zuordnungs-Tabelle sind lediglich Artikel-IDs mit Themen-IDs verknüpft. Folglich lässt sich eine Abfrage wie

SELECT * from artikel as a,
zuordnung as z
WHERE a.artikelID=z.artikelID
AND z.themaID='1'
AND z.themaID='2'


nicht durchführen. Vielmehr müssen wir die Zuordnungstabelle mehrfach einbinden:

SELECT * from artikel as a,
zuordnung as z1,
zuordnung as z2
WHERE
(a.artikelID=z1.artikelID AND z1.themaID='1')
AND
(a.artikelID=z2.artikelID AND z2.themaID='2')


Um unseren Abfrage-String aus einem Array aufzubauen, müssen wir theoretisch die Themenschleife zweimal durchlaufen lassen: Einmal für die FROM-Anweisung und einmal für die WHERE-Bedingungen. Das können wir jedoch auch in einem Durchlauf erledigen, indem wir beide Bestandteile in Variablen speichern:

$themen = explode(' ', $thema);
$anzahl = count($themen);

for ($x=0; $x<$anzahl; $x++) {
  // Thema-ID anhand des Themen-Namens ermitteln
  $tid = "select themaID from thema where name='$themen[$x]'";

  // Bestandteile in Variablen speichern
  $teil1 .= ", zuordnung as z$x";
  $teil2 .= " and (z$x.artikelID=a.artikelID and z$x.themaID=($tid))";
}


Im Anschluss müssen wir mit diesen beiden Variablen nur noch unseren String aufbauen:

SELECT * from artikel as a
$teil1
WHERE a.aktiv='1'
$teil2
group by a.artikelID
order by a.datum desc


So, ich werde nun ein kühles Bier trinken gehen. Auf den nächsten Teil.

Von Tilman Pietzsch am 01. Juli 2009, 17:50 Uhr veröffentlicht | 1081 mal gelesen
Zuletzt bearbeitet am 01. Juli 2009, 21:20 Uhr
Thema: Code

Kommentar schreiben


Kommentare

Geschrieben von Robert Wetzlmayr am 02. Juli 2009, 07:46 Uhr:


Wäre diese Aufgabe nicht über ein Subselect recht performant zu erledigen, speziell wenn die Zahl der einem Artikel zugeordneten Themen steigt?

Etwa so:

SELECT *
FROM artikel as a
WHERE a.artikelID in (
SELECT artikelID
FROM zuordnung AS z
WHERE z.themaID IN ('1', '2')
)

Geschrieben von Tilman am 02. Juli 2009, 12:23 Uhr:


Hallo Robert,

Dein String würde uns alle Artikel liefern, die Thema 1 ODER Thema 2 zugeordnet sind. Wir wollen aber nur diejenigen, die Thema 1 UND Thema 2 zugeordnet sind.

Die jetzige Variante war aus dem Grunde praktisch, dass ich die beiden Variablen $teil1 und $teil2 später noch für eine andere Abfrage missbrauche, um die Artikel-Anzahlen für die Navigation zu ermitteln. Darauf werde ich in Teil 3 näher eingehen.

Das soll aber nicht heißen, dass diese Abfragen hier optimal sind. Sie sind erstmal nur ein Lösungsweg und lassen sich sicher noch optimieren. Das Blog entstand in weniger als 3 Wochen und der Feinschliff erfolgt nun im Betrieb.

Geschrieben von LnddMiles am 26. Juli 2009, 22:02 Uhr:


Great post! I’ll subscribe right now with my feedreader software!

Geschrieben von online casino am 13. November 2009, 10:18 Uhr:


Es ist ein sehr gutes blog.


Kommentar schreiben