Jnnbo: Blog inkl. Tags erstellen

Guten Morgen,

ich erstelle gerade einen kleinen Blog. Es sollen auch Tags mit eingefügt werden.

Meine Frage, wie würdet ihr die Tags in der Datenbank speichern?

Meine Idee war folgende:

  • BlogID
  • BlogTitel
  • BlogInhalt
  • BlogDatum
  • BlogAutor
  • BlogTags

Die Tags sind mit , getrennt. Ist dieses Sinnvoll oder die Tags lieber in eine extra Tabelle schreiben und diese mit der BlogID verknüpfen?

Später möchte ich folgendes mit den Tags machen:

  • Suchen nach Tags und Auflistung der dazugehörigen Artikel
  • Tag Wolke

akzeptierte Antworten

  1. Hi,

    Meine Frage, wie würdet ihr die Tags in der Datenbank speichern?

    • BlogID
    • BlogTitel
    • BlogInhalt
    • BlogDatum
    • BlogAutor
    • BlogTags

    Die Tags sind mit , getrennt. Ist dieses Sinnvoll

    Nein. Versuch dann mal, nach einem Tag zu suchen! Du müßtest berücksichtigen, daß das Tag am Anfang des Strings steht, oder am Ende, oder in der Mitte.
    Stell Dir vor, es gäbe (bei verschiedenen Beiträgen) die Tags "Blitz", "Donner", "Montag", "Donnerstag".
    Und Du willst nach den Beiträgen suchen, die das Tag "Donner" haben. Dann darfst Du nicht einfach nach "Donner" suchen, denn damit erwischt Du auch die Beiträge, die nur "Donnerstag" in den Tags haben.

    Eine Spalte sollte keinen oder einen Wert enthalten, nicht mehrere!

    oder die Tags lieber in eine extra Tabelle schreiben und diese mit der BlogID verknüpfen?

    Ich würde 2 Extratabellen nehmen:
    Eine, die praktisch nur eine Liste aller Tags enthält,
    und eine, die die Verknüpfung Beitrag <--> Tag enthält.

    Dann kann man, ohne alle Beiträge durchwühlen zu müssen, auch einfach z.B. bei dem Such-Formular eine Vorschlagsliste für die Tags machen.

    cu,
    Andreas a/k/a MudGuard

  2. Tach!

    Die Tags sind mit , getrennt. Ist dieses Sinnvoll oder die Tags lieber in eine extra Tabelle schreiben und diese mit der BlogID verknüpfen?

    Es ist für die weitere Verarbeitung ungünstig, die Tags in einem Feld abzulegen. Du kannst dann nämlich nicht oder nur schwer Abfragen erstellen, wie die Liste aller Tags. Diese bekommst du nur, wenn du die Tag-Felder aller Threads liest, dann anderswo die Strings auseinanderfummelst und irgendwo eindeutig (unique) ablegst. Auch ein Zählen der Häufigkeit geht nur auf diese Weise.

    • Suchen nach Tags und Auflistung der dazugehörigen Artikel

    Das geht zur Not noch, beispielsweise mit einem regulären Ausdruck. Aber das läuft auf einen Full-Table-Scan hinaus, ein Index kann nicht verwendet werden. Das mag nicht schlimm sein, wenn der Datenbestand überschaubar klein ist. Ein heutiges DBMS zuckt erst bei sehr vielen Datensätzen mit der Wimper.

    • Tag Wolke

    Dazu brauchst du oben erwähnte Liste mit der Anzahl der Vorkommen.

    Die Frage ist noch, wie man die Tabellen strukturiert. Es gibt da zwei Ansätze. Der eine Ansatz ist, eine Tabelle für die Tags und eine Verknüpfungstabelle für die m-n-Beziehung zu den Threads zu erstellen. Wenn Tags vergeben werden, musst du zunächst nachschauen, ob es den bereits gibt, um die ID für die Verknüpfungstabelle zu bekommen. Oder du musst den Tag hinzufügen. Dabei ergibt sich jedoch ein TOCTTOU-Problem, wenn mehrere gleichzeitig dasselbe versuchen. Während der eine Vorgang arbeitet, darf der andere nicht mal lesend zugreifen, weil er sonst falsche Informationen bekommen kann. Für diesen Ansatz ist aber die Datenabfrage einfach zu realisieren, weil es keine Redundanzen gibt.

    Der andere Ansatz ist, eine Tabelle mit je einem Datensatz für den Thread-Verweis und einen Tagnamen. Das ergibt zwar Redundanzen, die man beim Abfragen mit GROUP BY oder zur Not auch DISTINCT wegbekommt. Andererseits muss man beim Eintragen keine Konkurrenz beachten. Man hat jedoch auch einen höheren Aufwand beim Pflegen der Tags (Löschen, Ändern).

    dedlfix.