2012-12-19 8 views
6

Sto costruendo un'app PHP/MySQL e sto permettendo agli utenti di creare i propri dati di profilo personalizzati (per quanto vogliono) (cioè possono aggiungere qualsiasi quantità di informazioni al loro profilo con caselle di testo aggiuntive, ma c'è un insieme "CORE" di campi del profilo utente)MySQL ma non conosco i nomi delle colonne prima della mano

Ad esempio, possono creare una nuova casella di testo sul modulo e chiamarlo "il mio animale domestico" e/o "il mio colore preferito ". Abbiamo bisogno di memorizzare questi dati in un database e non possiamo ovviamente creare colonne per ciascuna delle loro scelte poiché non sappiamo quali sono le loro informazioni aggiuntive prima della mano.

Un modo di pensare che potremmo memorizzare tutte le "informazioni addidional" che forniscono è quello di memorizzare le loro informazioni aggiuntive come JSON e conservarlo in un campo di testo MySQL (MySQL amo :))

che ho visto Plugin di compilatore di form Wordpress in cui è possibile creare i propri campi, quindi sto pensando che devono archiviare i dati in MySQL in qualche modo poiché le soluzioni NoSQL vanno oltre lo scopo di questi plugin.

Mi piacerebbe restare con MySQL ma voi ragazzi pensate che soluzioni NoSQL come MongoDB/Redis sarebbero una soluzione migliore da allora?

Grazie

+0

La risposta, come sempre, dipende da _. Se hai centinaia di migliaia di utenti, dovresti provare una varietà di soluzioni per vedere cosa scala. Ma, per un piccolo insieme di opzioni per un insieme relativamente piccolo di righe, JSON o un valore PHP serializzato, nel db relazionale esistente, va bene. Penso che Wordpress usi la serializzazione internamente per alcuni dei suoi record di opzioni. – halfer

+0

+1 per una domanda interessante e una bella funzionalità :-) –

risposta

1

Si potrebbe creare una tabella di coppie di valori chiave in cui tutto ciò che non nel nucleo sarebbe stato memorizzato. La tabella sarà simile a: user_id, name_of_user_specified_field, user_specified_value;

Qualsiasi name_of_user_specified_field che inizia a mostrare molte cose che è possibile aggiungere alla tabella principale. Questo è indicato come Entity-Attribute-Value. Si prega di notare, alcune persone considerano questo un anti-modello.

Se si esegue questa operazione, si prega di aggiungere controlli per limitare il numero di nuove voci di un utente può creare o si potrebbe trovare qualcuno ripieno il db con un sacco di campi :)

+0

Grazie Ray non ci ha mai pensato, ma potrebbe ??? diventa massiccio se un sacco di utenti con un sacco di campi personalizzati? Cosa ne pensi? –

+1

@BillJobs sì, ecco perché è necessario imporre un limite, come un utente può creare solo fino a 10 campi personalizzati. – Ray

+0

Molto molto vero, un limite avrebbe senso per "dati personalizzati" –

3

Un modo per avvicinarsi a questo è quello di utilizzare un tabella singola utilizzando il paradigma EAV, o Entity-Attribute-Value. Vedi lo Wikipedia article. Sarebbe molto più ordinato sotto molti aspetti che lasciare che gli utenti scelgano uno schema di database.

+0

Sembra davvero interessante e l'introduzione sembra risolvere il mio problema ... è nativo di MySQL o di un paradigma del design? –

+1

È un adattamento naturale per qualsiasi database relazionale. Potrebbe essere usato anche nel foglio di calcolo, suppongo. – wallyk

0

MySQL è in grado di gestirlo correttamente. Se i dati aggiuntivi verranno sempre estratti tutti insieme (ovvero non avrai mai bisogno di ottenere solo il campo pet senza altri campi aggiuntivi), puoi archiviarlo in una colonna nella tabella degli utenti. Tuttavia, se si desidera un modello più relazionale, è possibile memorizzare i dati aggiuntivi in ​​una tabella separata collegata dall'ID utente. La tabella aggiuntiva avrebbe una colonna per l'ID utente, il nome di campo aggiuntivo, il valore di campo aggiuntivo e qualsiasi altra cosa si possa desiderare. Quindi esegui una query JOIN quando ottieni il profilo per ottenere tutti i campi aggiuntivi.

+0

Grazie per la risposta G-Nugget, è serializzato la mia unica opzione quando non conosco i nomi delle colonne prima della mano? –

+0

@BillJobs No, puoi semplicemente inserire una nuova riga nella tabella delle informazioni aggiuntive con il nuovo nome e valore del campo. –

Problemi correlati