2010-08-22 8 views
7

Ich habe eine Datenbank, die zwei Tabellen enthält:Der beste Weg, um Tags in einer Datenbank zu speichern?

  • Einträge
  • Tags

Die Einträge Tabelle enthält Beiträge, die jeweils ein oder mehrere Tags. Das Problem ist, dass jeder Beitrag eine beliebige Anzahl von Tags haben kann. Mit anderen Worten, ich kann keine "tag1", "tag2" usw. Spalte haben und LINKE VERBINDUNGEN machen.

Wie sollte ich Einträge einrichten, so dass jeder Beitrag eine beliebige Anzahl von Tags haben kann?

Antwort

11

Sie benötigen eine Zuordnungstabelle.

Erstellen Sie eine Tabelle namens entries_tags, die zwei Spalten enthält: entry_id und tag_id, mit einem Multi-Schlüssel auf beiden Einträgen.

Dies wird viele-zu-viele-Beziehung genannt.

+0

Ja, und stellen Sie sicher, dass kein Eintrag doppelte Tags haben. Das Aktualisieren des Tags ist etwas knifflig, da Sie sicherstellen müssen, dass die vorhandenen Tags erhalten bleiben, neue hinzugefügt und gelöschte entfernt werden. Natürlich können Sie immer alle entfernen und dann alles wieder hinzufügen, um Ihnen die Mühe des Vergleichens zu ersparen. Vor- und Nachteile würde ich sagen. –

+1

@ o.k.w: Sie können alle diese Probleme über Fremdschlüsseleinschränkungen und Transaktionsupdates behandeln. – Borealid

+0

@ o.k.w: Auch ein Primärschlüssel (bevorzugt) oder eine eindeutige Einschränkung für beide Spalten würde die Eindeutigkeit pro Kombination sicherstellen. –

3

Sie können es auch tun, die SO-Weg, wo neben eine Kreuzung/Kartierungs-/Kreuzungstabelle mit, eine Liste von Tags auf den Eintrag haben, die markierbare ist:

entries table: 
post_id: 3539744, .... tags: sql, database, database-design, tags, data-modeling 

Wenn Sie kann den Leistungseinbruch einer Junction-Tabelle nicht nutzen, wenn die zugeordneten Tags für einen Eintrag abgerufen werden. Natürlich ist hier besondere Vorsicht geboten, da es sich um denormalisierte Daten handelt.