Ho bisogno di progettare un DB per la memorizzazione dei dati valore-chiave. L'elenco dei nomi di chiavi non è fisso e dovrebbe espandersi in un secondo momento. Non voglio creare una tabella con una colonna per ogni chiave, perché avrò bisogno di aggiungere colonne frequentemente e potrebbe diventare troppo grande, e ho capito che il design Entity-Attribute-Value non è efficiente. Ho pensato al seguente tipo di design del tavolo, e sto chiedendo se ha senso e chiunque può venire con qualche inconveniente legato all'efficienza, alle dimensioni della tabella o qualsiasi altro problema -
Ogni colonna nella tabella è di un tipo di dati diverso; le colonne irrilevanti per una chiave sono NULL:
ID |DataType |KeyName |ValInt |ValSmallInt|ValBool |ValStr |ValText |ValDate
-------------------------------------------------------------------------------
1 |1 (int) |Width |100 |NULL |NULL | NULL | NULL | NULL
2 |1 (int) |Height |200 |NULL |NULL | NULL | NULL | NULL
3 |2 (bool) |IsActive|NULL |NULL |false | NULL | NULL | NULL
4 |3 (text) |URL |NULL |NULL |NULL | NULL | w.com | NULL
5 |1 (int) |Size |4 |NULL |NULL | NULL | NULL | NULL
6 |4 (date) |Created |NULL |NULL |NULL | NULL | NULL | 2/2/2012
Il numero di colonne sarà il numero di tutti i tipi di dati (circa 30?).
La colonna DataType è un flag di tipo int che viene utilizzato per il chiamante: indica da quale colonna deve essere preso il valore.
Ogni riga è in realtà una proprietà di alcuni oggetti in un'altra tabella. Un insieme di righe crea un insieme di proprietà per quell'oggetto e in genere un SELECT otterrà l'intero set.