Qual è il modo più efficiente per archiviare i tag in un database?


138

Sto implementando un sistema di tagging sul mio sito Web simile a quello utilizzato da uno stackoverflow, la mia domanda è: qual è il modo più efficace per archiviare i tag in modo che possano essere cercati e filtrati?

La mia idea è questa:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

È troppo lento? C'è un modo migliore?



1
A partire dal 2016, usa Solr o Elasticsearch
Charles L.

Risposte:


189

Un articolo avrà molti tag. E un tag apparterrà a molti articoli. Ciò implica per me che probabilmente avrai bisogno di un tavolo intermedio per superare l'ostacolo molti-a-molti.

Qualcosa di simile a:

Tabella:
colonne degli elementi : Item_ID, Item_Title, contenuto

Tabella:
Colonne tag : Tag_ID, Tag_Title

Tabella: Column_
Items_Tags: Item_ID, Tag_ID

È possibile che la tua app web sia follemente popolare e necessiti di denormalizzazione lungo la strada, ma è inutile confondere le acque troppo presto.



se esiste qualcosa come tagGroup come gestirlo, ad esempio i tag sono raggruppati in categorie, ad esempio: Linguaggi di programmazione: c #, vb, pearl. Sistema operativo: windows7, dos, linux etc
Thunder

4
@Thunder: supponendo che un tag possa appartenere solo a una categoria, creerei una tabella TagCategory composta da ID_categoria e nome_categoria. Da lì, aggiungerei un campo category_id alla tabella Tag ed eseguirò un join su quello.
Simon Scarfe,

114

Dovresti leggere i post sul blog di Philipp Keller sull'etichettatura degli schemi di database. Ne prova alcuni e riporta i suoi risultati, sia in termini di facilità di costruzione di query comuni , sia in termini di prestazioni . Il numero di tag, il numero di elementi con tag e il numero di tag per articolo erano tutti fattori. I post sono del 2005; Da allora non sono a conoscenza di aggiornamenti.


19
Penso che questa sia la risposta migliore. Si basa su test e ricerche reali piuttosto che su supposizioni come la maggior parte delle altre risposte.
Cristian Vrabie,

4
I collegamenti nella risposta non sembrano funzionare. Trovato una copia su vtidter.blogspot.be/2014/02/database-schema-for-tags.html
Christophe Herreman

8

In realtà credo che la de-normalizzazione della tabella dei tag potrebbe essere un modo migliore per andare avanti, a seconda della scala.

In questo modo, la tabella dei tag ha semplicemente tagid, itemid, tagname.

Otterrai tagname duplicati, ma rende l'aggiunta / rimozione / modifica di tag per elementi specifici MOLTO più semplice. Non è necessario creare un nuovo tag, rimuovere l'allocazione di quello vecchio e riassegnare uno nuovo, basta modificare il tagname.

Per visualizzare un elenco di tag, devi semplicemente usare DISTINCT o GROUP BY e, naturalmente, puoi contare quante volte un tag viene usato facilmente.


4

Se non ti dispiace usare un po 'di cose non standard, Postgres versione 9.4 e successive ha un'opzione per memorizzare un record di tipo JSON.

Il tuo schema sarebbe:

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]

Per maggiori informazioni, vedi questo eccellente post di Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html

Ci sono più opzioni diverse confrontate accuratamente per le prestazioni e quella suggerita sopra è la migliore in assoluto.


2

Suggerirei di utilizzare la terza tabella intermedia per l'archiviazione di tag <=> associazioni di articoli, poiché abbiamo relazioni molti-a-molti tra tag ed elementi, vale a dire che un articolo può essere associato a più tag e un tag può essere associato a più articoli. HTH, Valve.


1

Non puoi davvero parlare di lentezza in base ai dati che hai fornito in una domanda. E non penso che dovresti nemmeno preoccuparti troppo delle prestazioni in questa fase di sviluppo. Si chiama ottimizzazione prematura .

Tuttavia, suggerirei di includere la colonna Tag_ID nella tabella Tag. Di solito è buona norma che ogni tabella abbia una colonna ID.


1

Se lo spazio sarà un problema, disporre di una terza tabella Tag (Tag_Id, Titolo) per memorizzare il testo per il tag e quindi modificare la tabella Tag in (Tag_Id, Item_Id). Questi due valori dovrebbero fornire anche una chiave primaria composita univoca.


0

Gli articoli devono avere un campo "ID" e i tag devono avere un campo "ID" (chiave primaria, cluster).

Quindi crea una tabella intermedia di ItemID / TagID e inserisci " Perfect Index ".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.