Normalmente concordo con Yaakov Ellis ma in questo caso speciale esiste un'altra soluzione praticabile:
Usa due tabelle:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Questo ha alcuni importanti vantaggi:
Innanzitutto rende lo sviluppo molto più semplice: nella soluzione a tre tabelle per l'inserimento e l'aggiornamento di item
te devi cercare la Tag
tabella per vedere se ci sono già voci. Quindi devi unirti a loro con nuovi. Questo non è un compito banale.
Quindi rende le query più semplici (e forse più veloci). Esistono tre query di database principali che verranno eseguite: Output tutto Tags
per uno Item
, disegnare un Tag-Cloud e selezionare tutti gli elementi per un titolo Tag.
Tutti i tag per un oggetto:
3-Table:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Tabella:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Tag-Cloud:
3-Table:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Tabella:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Articoli per un 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-Tabella:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Ma ci sono anche alcuni inconvenienti: potrebbe richiedere più spazio nel database (che potrebbe portare a più operazioni del disco che è più lento) e non è normalizzato che potrebbe portare a incongruenze.
L'argomento size non è così forte perché la natura stessa dei tag è che sono normalmente piuttosto piccoli, quindi l'aumento delle dimensioni non è grande. Si potrebbe sostenere che la query per il titolo del tag è molto più veloce in una piccola tabella che contiene ogni tag una sola volta e questo è certamente vero. Ma considerare i risparmi per non dover aderire e il fatto che è possibile costruire un buon indice su di essi potrebbe facilmente compensare questo. Questo ovviamente dipende fortemente dalle dimensioni del database che si sta utilizzando.
Anche l'argomento dell'incoerenza è un po 'controverso. I tag sono campi di testo gratuiti e non è prevista alcuna operazione come "rinomina tutti i tag" pippo "in" barra "".
Quindi tldr: sceglierei la soluzione a due tavoli. (In effetti lo farò. Ho trovato questo articolo per vedere se ci sono argomenti validi contro di esso.)