Normalerweise würde ich mit Yaakov Ellis zustimmen, aber in diesem speziellen Fall gibt es eine andere praktikable Lösung:
Verwenden Sie zwei Tabellen:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Dieser einige wichtige Vorteile:
Zuerst macht es Entwicklung viel einfacher: in der Drei-Tabellen-Lösung für Einfügen und Update von item
müssen Sie die Tag
Tabelle nachsehen, ob es bereits Einträge gibt. Dann müssen Sie sie mit neuen verbinden. Dies ist keine triviale Aufgabe.
Dann macht Abfragen einfacher (und vielleicht schneller). Es gibt drei wichtige Datenbankabfragen, die Sie ausführen werden: Geben Sie alle Tags
für eine Item
aus, zeichnen Sie eine Tag-Cloud und wählen Sie alle Elemente für einen Tag-Titel aus.
Alle Schlagworte für ein Item:
3-Table:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Table:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Tag-Cloud:
3- Tabelle:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Table:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Angebote für einen Tag:
3-Table:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-Table:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Aber es gibt auch einige Nachteile: Es könnte mehr Platz in der Datenbank benötigen (was zu mehr Festplattenoperationen führen könnte, was langsamer ist) und es ist nicht normalisiert, was zu Inkonsistenzen führen könnte.
Die Größe Argument ist nicht so stark, weil die eigentliche Natur der Tags ist, dass sie normalerweise ziemlich klein sind, so dass die Größenzunahme nicht groß ist. Man könnte argumentieren, dass die Abfrage nach dem Tag-Titel in einer kleinen Tabelle, die jedes Tag nur einmal enthält, viel schneller ist, und dies ist sicherlich wahr. Aber die Einsparungen zu berücksichtigen, weil man nicht beitreten muss, und die Tatsache, dass man einen guten Index dafür aufbauen kann, könnten dies leicht kompensieren. Dies hängt natürlich stark von der Größe der Datenbank ab, die Sie verwenden.
Das Inkonsistenzargument ist auch ein wenig unklar. Tags sind freie Textfelder und es gibt keine zu erwartende Operation wie 'alle Tags umbenennen "foo" in "bar"'.
Also tldr: Ich würde für die Zwei-Tabellen-Lösung gehen. (. In der Tat, ich werde fand ich diesen Artikel zu sehen, ob es gültige Argumente dagegen.)
Okay das ist Frage # 20856, die (fast) gleiche Frage wird # 48475 mindestens zwei Wochen nach dieser Frage gestellt. – dlamblin
Eine weitere interessante Frage ist "Wie implementiert SO Tags?" – Mostafa
Eine andere interessante Frage ist "Würden Sie sie internationalisieren, und wenn ja, wie?" – DanMan