Progettazione del database per il sistema di etichettatura

5

Sto creando un sistema in cui gli articoli avranno uno o più tag.

Ora ci sarà una tabella elemento che memorizzerà ogni elemento e una tabella tag , che memorizzerà tutti i tag utilizzati nel sistema.

La mia domanda è: qual è il miglior design che posso avere che mi consenta di collegare elementi ai rispettivi tag e registrare quante volte un oggetto ha ricevuto un particolare tag da un utente?

Ad esempio, mi chiedo se dovrei creare una terza tabella che assocerebbe un particolare elemento a un particolare tag e quante volte è stato selezionato quel tag. I campi dovrebbero essere come questo: item_id, tag_id, tag_hits - dove tag_hits è il numero di volte in cui il tag è stato utilizzato. Queste soluzioni assocerebbero tutti gli articoli con i loro tag in un'unica tabella.

O l'altra soluzione a cui sto pensando è creare una tabella per ciascun elemento e registrare ogni tag e la quantità di tempo in cui il tag è stato utilizzato. Quindi, per itemX vorrei creare una tabella itemX e i campi sarebbero: tag_id, tag_hits. Per un altro articoloY, creerei una tabella chiamata itemY con gli stessi campi. Quindi per ogni articolo, ci sarebbe una tabella che la associa ai suoi tag. Ora potrebbero esserci centinaia di migliaia di elementi in questo sistema.

Suppongo che gli sviluppatori di questo sito web debbano fare una considerazione simile perché ogni domanda è taggata. E puoi sfogliare le domande per tag. Il mio sistema avrà funzionalità simili.

Qualcuno può consigliare una soluzione di design, tenendo conto di tutto ciò che ho detto e della considerazione delle prestazioni. Si prega di indicare dove si pensa che l'indicizzazione potrebbe aiutare anche. Io uso i database SQL nel mio sviluppo, ma se pensi che una soluzione no-SQL lo faccia, per favore suggerisci un progetto seguendo queste linee. per favore sii molto specifico.

Grazie, Ron

    
posta Ron 09.10.2011 - 20:01
fonte

1 risposta

5

Vai con il tuo primo approccio, è praticamente il modo standard di modellare questo tipo di relazione. (aggiornato per registrare l'utente che ha aggiunto il tag)

Elementi
ItemID (PK)

ItemTags
ItemID (FK)
TagID (FK)

Tag
TagID (PK)

usertags
ItemID (FK)
UserID (FK)

Puoi farlo anche aggiungendo una colonna UserID alla tabella ItemTags e consentendo le righe duplicate per ogni tag, ma l'approccio di cui sopra è probabile che sia più performante.

Il secondo approccio sembra una cattiva idea dato che non ti darebbe la flessibilità per aggiungere più tag in futuro e probabilmente renderebbe le query più difficili da scrivere.

Come per l'indicizzazione: indicizza ciascuna chiave esterna (le chiavi primarie dovrebbero automaticamente essere indicizzate).

Utilizza un RDBMS, una soluzione NO-SQL probabilmente non ti darebbe alcun beneficio per questo tipo di struttura dati.

Qualunque cosa tu faccia, evita di creare campi multi-valore con qualche tipo di valori delimitati da virgola o spazio. È un killer delle prestazioni e rende le query davvero difficili da scrivere.

    
risposta data 09.10.2011 - 20:48
fonte

Leggi altre domande sui tag