EDIT: alle persone che costruiscono sistemi di etichettatura. Non leggere questo. Non è quello che stai cercando. Ho chiesto questo quando non ero a conoscenza del fatto che tutti gli RDBMS hanno i propri metodi di ottimizzazione, basta usare uno schema semplice da molti a molti.Schema di codifica del database scalabile
Ho un sistema di registrazione che ha milioni di post. Ogni post può avere un numero infinito di tag associati ad esso.
Gli utenti possono creare tag con note, data di creazione, proprietario, ecc. Un tag è quasi come un post stesso, perché le persone possono pubblicare note sul tag.
Ogni associazione di tag ha un proprietario e una data, quindi possiamo vedere chi ha aggiunto il tag e quando.
La mia domanda è come posso implementarlo? Deve essere veloce ricerca post per tag, o tag per posta. Inoltre, gli utenti possono aggiungere tag ai post digitandone il nome in un campo, un po 'come la barra di ricerca di Google, che deve riempire il resto del nome del tag per te.
Ho 3 soluzioni al momento, ma non sono sicuro quale sia il migliore, o se c'è un modo migliore.
Nota che non sto visualizzando il layout delle note poiché sarà banale una volta ottenuta una soluzione adeguata per i tag.
Metodo 1. Lista concatenata
TagID in punti di post ad una lista collegata a tag_assoc, l'applicazione devono attraversare l'elenco fino Flink = 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
Metodo 2. Denormalizzazione
tag è semplicemente un campo VARCHAR o TEXT che contiene un array delimitato da tab di tagId: ownerId. Non può essere una dimensione fissa.
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
Metodo 3. Toxi
(da: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html, anche stessa cosa qui: Recommended SQL database design for tags or tagging)
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
Metodo 3 solleva la questione, quanto velocemente sarà per scorrere tutti singola riga in tag_assoc?
I metodi 1 e 2 devono essere veloci per la restituzione dei tag per posta, ma per i post per tag, è necessario creare un'altra tabella di ricerca.
L'ultima cosa di cui mi devo preoccupare è l'ottimizzazione della ricerca dei tag per nome, non ho ancora funzionato.
ho fatto un diagramma ASCII qui: http://pastebin.com/f1c4e0e53
I tag sono condivisi tra i post. Sono praticamente deciso sul metodo 3 ora. Ogni tabella che può contenere tag avrà un'altra tabella chiamata _tags. EG: news_tags. Sono ancora un po 'approssimativo su questo metodo, ma tutti sembrano raccomandarlo, quindi presumo che MySQL lo ottimizzerà. –
"assumendo" - cattiva idea. Sapere è meglio. – duffymo