Wie entwerfe ich eine MySql-Tabelle für eine Tag Cloud?

7

Ich habe Artikel auf meiner Website, und ich möchte Tags hinzufügen, die jeden Artikel beschreiben würden, aber ich habe Probleme mit der Design-Tabelle mysql für Tags. Ich habe zwei Ideen:

  1. Jeder Artikel würde Feld "Tags" haben, und Tags wären im Format: "tag1, tag2, tag3"
  2. Erstellen Sie eine andere Tabelle namens Tags mit Feldern: tag_name, article_id

Wenn ich also Tags für Artikel mit ID 1 haben möchte, würde ich

ausführen %Vor%

Aber ich würde auch gerne 3 ähnlichste Artikel durch den Vergleich von Tags kennen, also wenn ich einen Artikel mit Tags "php, mysql, erlang" und 5 Artikel mit Tags habe: "php, mysql", "erlang, ruby "," php erlang "," mysql, erlang, javascript ", würde ich 1., 3. und 4. wählen, da diese 3 die gleichen Tags mit dem Hauptartikel haben.

Auch andere Frage, was ist der beste Weg, um 10 "am häufigsten verwendeten Tags" zu bekommen?

    
mfolnovich 08.04.2010, 19:50
quelle

3 Antworten

17

Im Allgemeinen gibt es für diese Art von Viele-zu-Viele-Beziehung drei Tabellen:

  • Die Tabelle " article "
    • Primärschlüssel = ID
  • Die Tabelle " tag "
    • Primärschlüssel = ID
    • enthält die Daten jedes Tags:
      • Name, zum Beispiel
  • Eine Tabelle " tags_articles ", die als Join-Tabelle fungiert und nur Folgendes enthält:
    • id_article : Fremdschlüssel, der auf einen Artikel
    • verweist
    • id_tag : Fremdschlüssel, der auf ein Tag
    • verweist


Auf diese Weise werden die Daten eines Tags nicht dupliziert. Für jedes Tag gibt es eine und nur eine Zeile in der Tabelle tag .

Und für jeden Artikel können Sie mehrere Tags haben (d. h. mehrere Zeilen in der Tabelle tags_articles ); und natürlich können Sie für jede Tags mehrere Artikel haben.

Eine Liste von Tags für einen Artikel mit dieser Idee zu erhalten, ist eine Frage von einer zusätzlichen Abfrage, wie:

%Vor%


Die drei "ähnlichsten" Artikel zu erhalten, würde bedeuten:

  • wähle Artikel aus, die Tags haben, die der erste Artikel
  • hat
  • verwenden nur diejenigen, die die meisten identischen Tags haben

Nicht getestet, aber eine Idee könnte etwas sein, das so aussehen würde:

%Vor%

Grundsätzlich, Sie:

  • Wählen Sie die Artikel-IDs für jedes Tag, das in Ihrem ursprünglichen Artikel vorhanden ist
    • Da es einen inneren Join gibt, wenn ein Artikel in der DB 2 Tags hat, die der where -Klausel entsprechen, ohne die group by -Klausel, gäbe es zwei Zeilen für diesen Artikel
    • Natürlich möchten Sie den Artikel, den Sie bereits hatten, nicht erneut auswählen - was bedeutet, dass er ausgeschlossen werden muss.
  • Aber wenn Sie group by article.id verwenden, wird es nur eine Zeile pro Artikel geben
    • Sie können jedoch count verwenden, um herauszufinden, wie viele Tags jeder Artikel mit dem ersten
    • gemeinsam hat
  • dann, es ist nur eine Frage der Sortierung nach Anzahl der Tags und nur die dritten drei Zeilen.
Pascal MARTIN 08.04.2010, 19:55
quelle
1

Zunächst sollten Sie den Vorschlag von Pascal MARTIN zum Tischdesign verwenden.

Um ähnliche Artikel zu finden, hier ist etwas, mit dem Sie beginnen können. Da @ article_id der Artikel ist, nach dem Sie suchen möchten, und @ tag1, @ tag2, @ tag3 sind die Tags für diesen Artikel:

%Vor%     
Eric Petroelje 08.04.2010 20:03
quelle
0

ja, aber Sie haben meine Hauptfrage nicht beantwortet, wie Sie 3 ähnlichste Artikel bekommen?

Antwort: Suchen Sie einfach nach den gleichen Tag-IDs in der zusammengeführten Tabelle (tags_articles). Sammeln Sie sie und erstellen Sie ein Muster.

Zum Beispiel: Artikel 1 hat Tags: 1,2 Artikel 2 hat Tags: 2,3,4 Artikel 5 hat Tags: 6,7,2 Artikel 7 hat Tags: 7,1,2,3

Wenn Sie die 3 ähnlichsten Artikel für Artikel 1 möchten, müssen Sie nach den Tags 1,2 suchen. Sie werden feststellen, dass Artikel 7 am ähnlichsten ist und 2 und 5 Ähnlichkeiten aufweisen.

    
Kel 08.04.2010 20:07
quelle