<p dir="ltr">> - user: id, name<br>
> - spec: id, label<br>
> - spec_values: id, id_user,id_spec, value.<br>
><br>
> Nella tabella spec ho alcune specifiche che possono essere assegnate agli utenti, tipo "email", "telefono",... e posso aggiungerle man mano a seconda della necessità. In spec_value ho il valore di queste specifiche, quindi il valore di email, di telefono,... </p>
<p dir="ltr">Questo modello si chiama Entity-Attribute-Value (EAV) [1]. È utile quando:</p>
<p dir="ltr">1 - I possibili attributi sono tanti, ma ciascuna entità ne valorizza solo pochi (matrice sparsa), per risparmiare spazio. <br>
2 - Gli attributi variano a runtime. </p>
<p dir="ltr">Negli altri casi è generalmente considerato un antipattern [2], visti i problemi che si porta dietro (tra i quali appunto la difficoltà di interrogazione). </p>
<p dir="ltr">Ti consiglierei, se puoi, di passare ad un design più tradizionale, in cui i vari attributi sono colonne della tabella 'user'. Gli attributi non mi sembrano tantissimi, e se non cambiano così rapidamente aggiungere / togliere / modificare qualche colonna di tanto in tanto è molto più conveniente di portarsi dietro EAV. <br>
Questo ti consente anche di specificare il tipo più giusto per ogni attributo, invece di usare stringhe ovunque. Le query su un modello "tradizionale" saranno efficienti (soprattutto se applichi gli indici dove servono) e facili da produrre, anche via codice (magari usando una libreria apposita invece di scrivere SQL manualmente, che linguaggio stai usando?). </p>
<p dir="ltr">Nel caso questo passaggio non ti fosse possibile, proverei a esplorare altri database, non relazionali e quindi più adatti a questi casi, come MongoDB [3]. Su MongoDB la soluzione al tuo problema diventa triviale.</p>
<p dir="ltr">[1] <a href="https://en.m.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model">https://en.m.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model</a><br>
[2] <a href="https://mikesmithers.wordpress.com/2013/12/22/the-anti-pattern-eavil-database-design/">https://mikesmithers.wordpress.com/2013/12/22/the-anti-pattern-eavil-database-design/</a><br>
[3] <a href="https://en.m.wikipedia.org/wiki/MongoDB">https://en.m.wikipedia.org/wiki/MongoDB</a></p>
<p dir="ltr">Ciao,<br>
-- <br>
Giuseppe Capizzi </p>