- Home
- Categorie
- Coding e Sistemistica
- PHP
- Ricerca a campi variabili
-
Ricerca a campi variabili
Buongiorno a tutti!
Sto cercando il modo migliore per fare una certa cosa... ma non trovo la quadratura del cerchio.
In un determinato sito, da pannello di controllo, gli operatori dovrebbero essere in grado di creare e riempire alcuni attributi di una scheda dati (--->mysql). Per esempio, se la scheda contiene **altezza **e peso, gli operatori devono poter aggiungere altri campi, tipo colore occhi, o numero di scarpe e poi ovviamente popolarli.
Volendo evitare, per diverse ragioni, la modifica della tabella, sarebbe sufficiente storare i dati in un campo testo, magari mediante *serialize *dei dati... e poi controllare i campi da un'altra tabella.
Il problema si complica perché mi viene chiesto poi, che gli utenti del sito possano fare selezioni precise tremite motore di ricerca su questi campi (altezza, peso, colore occhi e numero di scarpe) ed una query esatta sul campo testuale (es solo 1,78m e occhi celesti) ovviamente non è fattibile... :bho:
In condizioni normali creerei un campo per ogni attributo e via... ma in questo caso, gli attributi devono poter essere modificati dagli operatori, da pannello di controllo, perché ad esempio si vuole eliminare il **numero di scarpe **ed introdurre colore dei capelli ed il titolo di studio.
Una possibile soluzione potrebbe essere quella di salvare il dato tramite serialize, e poi, nella ricerca selezionare tutti i record, per poi looppare nell'array per cercare quello che serve: ma se i record inziano a crescere in numero, rischio di far piantare il giochino...
Qualcuno di voi ha mai affrontato e risolto il problema?
Suggerimenti?Thanks! **
**
-
Ciao ceccus,
non puoi modificare la struttura della tabella quando l'operatore ha questa necessità?
-
Il problema è che gli operatori vorrebbero fare queste operzioni con una certa frequenza, senza interpellarmi...
-
Non devi per forza farle tu manualmente, puoi benissimo usare le query per alterare la struttura e farlo fare a loro dal pannello di controllo.
-
si, è una delle opzioni, ma preferivo non alterare la tabella per diverse ragioni...
-
Puoi comunque implementare una ricerca full-text sul campo serializzato, ma andresti incontro a diverse problematiche.
Intanto, mysql non riconosce una chiave da meno di 3 caratteri per una ricerca full-text (e questo già sarebbe un problema con il numero di scarpe).
In secondo luogo non avresti controllo sulla denominazione delle colonne. Spiegandomi meglio, da nessuna parte avresti scritto "il secondo campo del dato serializzato è il numero di scarpe", e le conseguenze di ciò sono abbastanza chiare. Per risolvere si potrebbe inserire in ogni campo anche la sua denominazione (tipo "[Numero di scarpe]38"), ma alla fine la colonna dei campi aggiuntivi sarebbe un grande, grosso e ingestibile duplicato.
Per me la soluzione più efficace ed efficiente sarebbe modificare direttamente la struttura della tabella, come suggeriva già Thedarkita. Se hai remore dovute al fatto che daresti il controllo del database a persone sostanzialmente inesperte, potresti effettuare dei controlli preventivi, per non permettere di aggiungere o eliminare determinate colonne.
-
Si, queste erano le ipotesi...
Con la ricerca sul campo serializzato hai il problema che se ricerchi un campo, ad esempio 42 di scarpa selezioni anche tutti i 42 che appartengono agli altri campi.Rifletterò meglio sulla possibilità di modificare il db, anche se continua a non piacermi...
Thanks!
-
@ceccus said:
Con la ricerca sul campo serializzato hai il problema che se ricerchi un campo, ad esempio 42 di scarpa selezioni anche tutti i 42 che appartengono agli altri campi.
Infatti, per risolvere potresti usare un'espressione regolare, o un explode, ma significa comunque elaborare ogni riga della query...
-
@ceccus said:
Rifletterò meglio sulla possibilità di modificare il db, anche se continua a non piacermi...
Per quanto pessima soluzione, su una mole di dati ridotta potrebbe esser ancora quasi accettabile.Considera che per modificare una tabella e aggiungere una colonna utilizzi il comando ALTER TABLE che, per una simile modifica strutturale, ha necessità di creare una tabella temporanea copia di quella originale a cui aggiunge la/le colonna/e.
Al crescere delle dimensioni della tabella aumentano i requisiti sia di tempo, di memoria e spazio disco necessari (la tabella temporanea occuperà spazio fisico sul disco e se hai a disposizione solo un certo numero di Mb per mysql...).Puoi provare a gestire diversamente il problema utilizzando più tabelle per la raccolta dei dati "personalizzati".
Un possibile esempio:tabella: tipo_field - id - field_type - field_label tabella: field_data - id - id_scheda - id_tipo_field - value
Per contro questo sicuramente complicherà la tua parte di programmazione nella creazione dinamica delle JOIN corrette per le ricerche.
Alessandro