Dati complessi su database: serializzazione o relazioni tra tabelle?

di Andrea Turso - 5 agosto 2008

Qual'è il miglior modo per memorizzare un dato complesso su un database: serializzare una struttura - come un oggetto o un array - o utilizzare delle tabelle sul database che rappresentino il dato complesso in più campi primitivi?

Personalmente credo che la soluzione del problema mediante la serializzazione sia più macchinosa, oltre che essere meno elegante in quanto richiederebbe al programmatore di serializzare il dato prima dell'inserimento e deserializzarlo alla sua estrazione affinché sia possibile utilizzarlo.

Piuttosto che utilizzare il metodo della serializzazione preferirei passare qualche ora in più per disegnare delle tabelle adeguate a contenere tale dato, ovviamente questo non sarebbe sempre possibile in quanto una struttura troppo complessa del database richiederebbe uno storage engine adatto e per via delle relazioni che si verrebbero a creare tra i record delle diverse tabelle - per evitare eventuali problemi di integrità dei dati - si dovrebbe ricorrere alle chiavi esterne, che non sono disponibili per lo storage engine MyIsam.

La soluzione in quel caso sarebbe l'utilizzo di MyISAM, ma purtroppo non tutti i fornitori di hosting ne permettono l'utilizzo. Quindi nel caso non fosse possibile utilizzare MyISAM si potrebbe in modo programmatico realizzando uno strato software che si occupi di verificare l'integrità dei dati, a discapito delle prestazioni e della facilità di manutenzione.

Ancora non so decidere quale dei due approcci sia il "migliore" ma ancora non sono pienamente convinto di quale scegliere quando mi trovo di fronte alla fase di progettazione. Sono comunque convinto che la scelta vada fatta in relazione al tipo di scenario che si ha di fronte e agli strumenti che si hanno a disposizione.

2 commenti

1 Gianni Tomasicchio Gianni Tomasicchio martedě 5 agosto 2008, ore 10:07
Ciao Andrea, nella mia esperienza lavorativa il ricorso alla serializzazione è stato più una eccezione che una regola. Progettare correttamente il database in modo che accolga qualsiasi struttura dati è un'attività sicuramente faticosa ma che ha un grosso vantaggio, quello di permettere l'elaborazione puntuale dei dati via SQL. La serializzazione invece rende i dati accessibili solo al software che è in grado di interpretarli.
Per questa ragione mi è capitato di usare campi di testo del database per memorizzare dei dati serializzati solo quando ero certo che questi sarebbero serviti esclusivamente a particolari funzionalità del software.
Ad esempio in un progetto ho dovuto generare dei tag HTML partendo dai dati presenti in una tabella del database. In questa tabella ho inserito un campo nel quale conservare la serializzazione di un array associativo "chiave->valore" contenente gli attributi del tag.
Per questi attributi avrei potuto modellare un'altra tabella in relazione "uno-a-molti" ma non ne valeva la pena, sapevo che non avrei mai fatto una ricerca per trovare, ad esempio, tutti i tag che contengono un particolare attributo.
2 Andrea Turso Andrea Turso giovedě 11 settembre 2008, ore 23:52
Bene, credevo di essere l'unico a pensare che la serialzzazione debba essere un'eccezione più che una regola.

Francamente sono dell'idea che saper progettare, e magari anche gestire, una base di dati coerente sia un'elemento fondamentale nel bagaglio di conoscenze di un programmatore.

Vorrei fare un piccolo rimprovero al team di Wordpress per via del design del database. Sarà così superficiale solo per motivi di "semplicità", velocità di sviluppo o altro? Per caso è l'apoteosi del New Jersey style?
A parte quello è un'ottima applicazione :-)

ps: Sono rimasto sorpreso quando ho visto pubblicato questo post. L'avevo lasciato non pubblicato perché mi ero scoraggiato dopo l'ennesimo tentativo di completarlo reso vano dall'antipatia del sistema di blogging. Anche se è scritto alla buona, credo che si capisca comunque quello che volevo dire.

,Andrea
Effettua l'accesso o registrati per inserire un commento