2010-12-21 9 views
9

Ich möchte ein einfaches Tag-System mit PHP und MySQL erstellen, so dass Benutzer einige Tags über Formular hinzufügen können. Meine Frage ist, sollte ich die Tags als ein Array in einer einzelnen Datenbankspalte speichern? z.B. "tag1, tag2, tag3" .. oder ich sollte separate Spalten in der Datenbanktabelle haben, wo ich jedes Tag in jeder Spalte speichern sollte. ich hoffe meine Frage ist klar. Danke.Wie kann man Tags (Schlüsselwörter) in der Datenbank speichern?

Antwort

20

würde ich wahrscheinlich auch nicht sagen. Verwenden Sie eine Viele-zu-Viele-Beziehung zwischen Tags und dem zu markierenden Objekt. Zum Beispiel, wenn das Ding markiert ist eine Frage ist, könnte die Tabellen wie folgt aussehen:

Question: 
    QuestionId 
    Title 
    Body 

Tag: 
    TagId 
    Name 

QuestionTags: 
    QuestionId 
    TagId 
+3

Dieser Weg bietet Skalierbarkeit und ermöglicht Datenbank-Optimierung mit Indizes. Gute Antwort. –

+0

Ich bin auf dieser Seite gelandet auf der Suche nach Empfehlungen für die Aktualisierung einer Tag-Liste in einem solchen Schema. Wie würdest du es machen? DELETE FROM QuestionTags WHERE QuestionId = 123 und dann INSERT INFO QuestionTags alle verbleibenden und neuen Tags? Es scheint der einfachste für den Entwickler, aber vielleicht nicht der beste für die Leistung ... – Henno

+0

@Henno Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Kannst du eine separate Frage stellen? –

0

könnten Sie verwenden serialise und unserialise die Schlüsselwörter in einem Feld zu speichern. Mehr Infos hier http://php.net/manual/en/function.serialize.php

So etwas ...

$keywords = array('apple', 'pear', 'banana', 'peach'); 
$keywords_serialized = serialize($keywords); 
$sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized); 
+2

Wie Leistung zu töten ... –

+2

Es sollte eine sehr seltene Sache sein, dass eine serialisierte Zeichenfolge in einer Datenbank gespeichert werden sollte. –

+4

danke Ich habe heute etwas gelernt – user466764

8

kamen in dieser Frage heute auch und sammelte einige Ideen, die hier, und obwohl die Frage nicht ganz neu ist, werde ich meine verlassen Lösung:

ich denke, die Antwort von Klaus Byskov Hoffmann war nicht schlecht, aber ich würde hinzufügen und speichern Sie die Tag-Liste als viele-zu-viele Tabelle, wie er sagte, sondern auch als serialisierte Zeichenfolge in irgendeiner Form (entweder über serialize wie user466764 gesagt, oder einfach ein Komma getrenntes Ding wie du selbst gesagt hast, das mit i behandelt werden könnte mplode/explode) in der Haupttabelle.

ja, ich weiß: den gleichen Datenspeicher zweimal ist nicht sehr gut mit vielen Datenbank Perfektionisten erhalten, da sie die Gefahr des Erhaltens Inkonsistenzen trägt, aber ich würde für die Leistung und Einfachheit es auf diese Weise tun:

Die Viele-zu-Viele-Tabelle (Tag-Tabelle) dient nur zur Suche. Um die Suchleistung zu erhöhen, beschränke ich den Zugriff auf diese Tabelle NUR auf die Suche (und natürlich müssen wir sie aktualisieren, wenn die Tags bearbeitet werden), aber niemals abfragen, nur um die Tags irgendwo anzuzeigen/aufzulisten. und die serialisierte Tag-Liste ist für jeden Ort, an dem Sie den betreffenden Artikel oder Gegenstand sehen - wenn Sie diesen Gegenstand anzeigen, haben Sie die Tabelle bereits und machen jedesmal eine weitere Abfrage an die Tag-Tabelle, wenn Sie diese Seite anzeigen wollen unnötig, wenn Sie die Liste bereits in der Haupttabelle haben. Stellen Sie sicher, dass Sie beim Aktualisieren der Tags vorsichtig sind, um sie immer an beiden Orten zu aktualisieren, vorzugsweise über eine einzige Setter-Funktion, die beides tut, und Sie sollten keine Probleme mit Inkonsistenzen haben.

+0

Stimme völlig zu. Die Optimierung der Seitenladezeit sollte genauso wichtig sein wie die Normalisierung der Datenbank. – KalC

Verwandte Themen