Sto aggiungendo una nuova funzione al mio modulo utente per il mio CMS e ho colpito un blocco stradale ... O credo, un fork in the road, e volevo ottenere alcune opinioni da StackOverflow prima di impegnarmi a nulla.
In pratica, voglio consentire agli amministratori di aggiungere nuovi campi utente "extra" che gli utenti possono compilare alla registrazione, modificare nel proprio profilo e/o essere controllati da altri moduli. Un esempio di questo sarebbe un campo di compleanno, una lunga descrizione di se stessi, o forse punti che l'utente ha guadagnato sul sito. Inutile dire che i dati memorizzati saranno variati e possono variare da grandi quantità di testo a un valore intero piccolo. Per peggiorare le cose, voglio che ci sia la possibilità di cercare questi dati.Il modo migliore per archiviare dati utente "extra" in MySQL?
Con quello fuori mano - quale sarebbe il modo migliore per farlo? In questo momento mi sto appoggiando ad avere un tavolo con le seguenti colonne.
userid, refFieldID, varchar, tinyint, smallint, int, text, date, datetime, etc.
io preferirei questo come sarebbe rendere la ricerca molto più veloce, e la tabella di riferimento (che detiene tutti i dati del campo, come ad esempio il nome del campo, se è ricercabile o no, ecc) può fare riferimento a quale colonna deve essere usata quando si memorizzano i dati per quel campo.
L'altra idea, che mi è stata suggerita e che ho visto utilizzata in altre soluzioni (vBulletin è una, anche se ho visto altri i cui nomi mi sfuggono al momento), dove hai appena l'ID utente, l'ID di riferimento e un campo di testo. Non so abbastanza su MySQL per dirlo con certezza, ma questo metodo sembra che sia più lento per la ricerca, e possibilmente avere un sovraccarico maggiore.
Quindi quale metodo sarebbe "migliore"? C'è un altro metodo che mi manca? Qualunque sia il metodo che uso, deve essere veloce per la ricerca, non massiccia (un po 'di overhead va bene), e preferibilmente consentire query complesse usate contro i dati.
Wow, grazie, in realtà stavo per rispondere alla prima persona che ha concordato con # 1, quali colonne scegliere - ma suppongo di non doverlo più :). Per quanto riguarda il tuo post, intendi testo AND blob, int AND bigint? O l'uno o l'altro? Inoltre, come ti senti ad aggiungere una colonna "bool" (tinyint (1))? Potrei vedere che è molto utile e probabilmente usato molto - varrebbe la pena di salvare i 3 byte, secondo lei? Inoltre, il numero di colonne aumenta la dimensione di una riga sul disco? Colonne vuote, ovviamente. Non sto dubitando della tua disposizione (stupenda) della tabella, solo curiosa. – Jon
1 per ogni elemento nel mio elenco, quindi 3 o 4 colonne totali, a seconda se si desidera il supporto float. Come per tinyint (1) - memorizza quelli nella colonna intera. Stai sprecando un byte aggiungendo tinyint (1), non salvando 3. Ogni riga della tua tabella ha sempre la stessa larghezza in MySQL - funziona allo stesso modo nella maggior parte degli altri RDBMS. (Il modo in cui i varchar influiscono su questo diventa un po 'complicato). "Larghezza" è anche chiamato "dimensione della riga". – wuputah