Wege zur Umsetzung-tags - vor-und Nachteile der einzelnen
Mit SO als Beispiel, was ist die vernünftigste Art und Weise zu verwalten, tags wenn Sie erwarten, werden Sie oft ändern?
Weg 1: Ernst denormalisierte (Trennzeichen-getrennt)
Tabelle Beiträge +--------+-----------------+ | postId | tags | +--------+-----------------+ | 1 | c++,Suche,code |
Hier-tags werden durch Komma getrennt.
Profis: Tags abgerufen werden gleichzeitig mit einem einzigen select
Abfrage. Aktualisierung von tags ist einfach. Einfach und Billig zu aktualisieren.
Nachteile: Extra parsing-tag auf Abruf, schwer zu zählen, wie viele posts verwenden Sie die tags.
(alternativ, wenn auch begrenzten, so etwas wie 5 tags)
Tabelle Beiträge +--------+-------+-------+-------+-------+-------+ | postId | tag_1 | tag_2 | tag_3 | tag_4 | tag_5 | +--------+-------+-------+-------+-------+-------+ | 1 | c++ |search | Codes | | |
Weg 2: "Etwas normalisiert" (separate Tabelle, keine Kreuzung)
Tabelle posts +--------+-------------------+ | postId | Titel | +--------+-------------------+ | 1 | Wie u-tag? | Tabelle taggings +--------+---------+ | postId | tagName | +--------+---------+ | 1 | C++ | | 1 | suchen |
Profis: Einfach zu sehen-tag zählt (count(*) from taggings where tagName='C++'
).
Nachteile: tagName wird wahrscheinlich wiederholt werden viele, viele Male.
Weg 3: Die coolen kid ' s (normalisiert mit Schnittpunkt Tabelle)
Tabelle Beiträge +--------+---------------------------------------+ | postId | Titel | +--------+---------------------------------------+ | 1 | Warum ist ein Rabe wie ein Schreibtisch? | Tabelle tags +--------+---------+ | tagId | tagName | +--------+---------+ | 1 | C++ | | 2 | Suche | | 3 | foofle | Tabelle taggings +--------+---------+ | postId | tagId | +--------+---------+ | 1 | 1 | | 1 | 2 | | 1 | 3 |
Profis:
- Keine sich wiederholenden tag-Namen.
- Mehr Mädchen wie Sie.
Nachteile: teurer ändern tags, als Weg #1.
- Ich würde senden Sie eine E-Mail / twitter jemanden, der hatte für die Verwaltung von tags, bevor Sie. Wie Jeff Atwood oder einem der anderen, SO die Entwickler. Sie könnten in der Lage sein zu geben, einige Einblicke.
- klingt für mich wie Sie nur die Frage beantwortet. So wählen Sie einfach die, die am besten passt Ihre Anforderungen. Wenn Sie möchten, dass Mädchen wie Sie, dann gehen Sie für die #3.
- Mehr Mädchen wie Sie, eh? Ich mag, dass die Wahl!
- Verwandte und möglicherweise doppelte: stackoverflow.com/questions/1810356/how-to-implement-tag-system
- Ich bin kein sql-Experte. Könnten Sie mir bitte sagen, ob ich hinzufügen sollte einen Primärschlüssel enthalten
postId
undtagId
zu dentaggings
Tabelle? Dies würde verhindern, dass das hinzufügen der gleiche tag, um einen post mehrere Male. - Für diejenigen, die Lesen meinen Kommentar oben. Ich denke, es ist am besten, einfach fügen Sie ein eindeutige Einschränkung
- hast du irgendwelche Mädchen, die mit Methode #3??? @bobobobo Frage für einen Freund
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Lösungen
mysqlicious
,scuttle
undtoxi
.Diesem Artikel vergleicht Vorteile und Nachteile der einzelnen.
Ich würde behaupten, dass es eine vierte Lösung, das ist eine Variante, die auf Ihre Dritte Lösung:
Bemerken, dass ich mit den tag-Namen als Primärschlüssel der Tags-Tabelle. Auf diese Weise können Sie einen filter auf bestimmte tags ohne die zusätzliche Verknüpfung der Tags-Tabelle selbst. Darüber hinaus, wenn Sie einen tag-Namen, wird es aktualisieren Sie die Namen in der PostTags Tabelle. Wenn Sie einen tag-Namen ist ein Seltenes Ereignis, dann sollte das kein problem sein. Wenn Sie einen tag-Namen ist ein gemeinsames auftreten, dann würde ich gehen mit Ihrem Dritten Lösung, wo Sie einen Ersatzschlüssel für die Referenz-tag.
scuttle
nur viel schwerer zu handhaben. Möglichkeit zu schreibenUPDATE Tags SET TagName = 'newtag' WHERE TagName = 'oldtag'
stattUPDATE PostTags SET TagName = 'newtag' WHERE TagName = 'oldtag'
sind es echt nicht Wert.Update Tags Set Name = 'NewName' Where Name = 'OldName'
. Nicht schwieriger zu verwalten, dass, wenn Sie einen Ersatzschlüssel. Die eigentliche Frage ist, ob der Vorteil der Vermeidung der zusätzlichen join überwiegt die Häufigkeit, mit der Sie die änderung einer bestehenden tag-Namen. Da würde ich davon ausgehen, das später ist nur selten erforderlich, werden die performance-Vorteile bringt, ist wohl Wert es.scuttle
) außer mit einer extra Tabelle (Tags
) Sie dient keinem Zweck?scuttle
Sie nicht haben, um sich an derTags
Tisch zu (Sie haben keineTags
Tisch, um mit zu beginnen).toxi
setup überhaupt.tsq1
und anderent-sql
.t-sql
und Sie wollte, um eine Beschreibung hinzuzufügen fürt-sql
gibt es kein Mittel, das zu tun, ohne Duplikate.sql
tag anstelle von einem Produkt/version spezifische-tag. Schwer zu tun mit dem krabbeln Ansatz.Ich persönlich favorisiere Lösung #3.
Stimme ich nicht zu, dass die Lösung #1, ist einfacher zu mantain.
Denken Sie an die situation, wo Sie haben, ändern Sie den Namen eines Tags.
Lösung #1:
Lösung #3:
Der erste ist der Weg schwerer.
Auch Sie haben, um mit den Kommas beim löschen von tags (OK, es ist leicht getan, aber immer noch schwieriger, dass nur das löschen einer Zeile in der
taggings
Tabelle)Als für Lösung #2... ist weder Fisch noch Fleisch
Ich denke, dass SO benutzt Lösung #1. Dann würde ich mit entweder #1 oder #3.
Eine Sache zu prüfen ist, wenn Sie haben einige Sache, die Sie markieren können (z.B. das hinzufügen von tags sowohl für post und Produkten, zum Beispiel). Dies kann Auswirkungen auf die Datenbank-Lösung.
Gut, ich habe die gleichen Zweifel, nahm ich die Dritte Lösung für meine website. Ich weiß, es gibt einen anderen Weg für den Umgang mit diesem problem von variable-length-Tupeln, besteht in der Verwendung von Spalten als Zeilen auf diese Weise haben Sie einige Informationen, die die Identifizierung der Tupel redudant und die unterschiedlichen diejenigen organisiert, eine für jede Zeile.
Dies ist wirklich schlecht, aber manchmal ist es die einzig machbare Lösung, und es ist sehr weit von dem relationalen Ansatz.