Sto lavorando a un editor che consente agli utenti di creare definizioni di "oggetto" in tempo reale. Una definizione può contenere zero o più proprietà. Una proprietà ha un nome un tipo. Una volta creata una definizione, un utente può creare un oggetto di quella definizione e impostare i valori della proprietà di tale oggetto.Schema per il supporto delle proprietà dinamiche
Quindi, con un clic del mouse, l'utente dovrebbe es. essere in grado di creare una nuova definizione chiamata "Bicicletta" e aggiungere la proprietà "Dimensioni" del tipo "Numerico". Quindi un'altra proprietà denominata "Nome" di tipo "Testo" e quindi un'altra proprietà denominata "Prezzo" di tipo "Numerico". Una volta fatto, l'utente dovrebbe essere in grado di creare un paio di oggetti "Bicicletta" e inserire i valori delle proprietà "Nome" e "Prezzo" di ogni bicicletta.
Ora, ho visto questa funzione in diversi prodotti software, quindi deve essere un concetto ben noto. Il mio problema è iniziato quando mi sono seduto e ho cercato di creare uno schema DB per supportare questa struttura dati, perché voglio che i valori delle proprietà siano archiviati usando i tipi di colonna appropriati. Vale a dire. un valore di proprietà numerico viene memorizzato come, ad esempio, un INT nel database e un valore di proprietà testuale viene memorizzato come VARCHAR.
In primo luogo, ho bisogno di una tabella che conterrà tutte le mie definizioni di oggetto:
Table obj_defs
id | name |
----------------
1 | "Bicycle" |
2 | "Book" |
Poi ho bisogno di un tavolo per lo svolgimento di che tipo di proprietà ogni definizione di oggetto deve avere:
Table prop_defs
id | obj_def_id | name | type |
------------------------------------
1 | 1 | "Size" | ? |
2 | 1 | "Name" | ? |
3 | 1 | "Price" | ? |
4 | 2 | "Title" | ? |
5 | 2 | "Author" | ? |
6 | 2 | "ISBN" | ? |
I Avrebbe anche bisogno di una tabella che contiene ogni oggetto:
Table objects
id | created | updated |
------------------------------
1 | 2011-05-14 | 2011-06-15 |
2 | 2011-05-14 | 2011-06-15 |
3 | 2011-05-14 | 2011-06-15 |
Infine, ho bisogno di un tavolo che wi ll contenere i valori delle proprietà reali di ogni oggetto, e una soluzione è per questa tabella abbia una colonna per ogni possibile tipo di valore, come questo:
Table prop_vals
id | prop_def_id | object_id | numeric | textual | boolean |
------------------------------------------------------------
1 | 1 | 1 | 27 | | |
2 | 2 | 1 | | "Trek" | |
3 | 3 | 1 | 1249 | | |
4 | 1 | 2 | 26 | | |
5 | 2 | 2 | | "GT" | |
6 | 3 | 2 | 159 | | |
7 | 4 | 3 | | "It" | |
8 | 5 | 3 | | "King" | |
9 | 6 | 4 | 9 | | |
Se ho implementato questo schema, quale sarebbe il "tipo" colonna della tabella prop_defs premuto? Integers che si associano a un nome di colonna, varchars che semplicemente contengono il nome della colonna? Altre possibilità? Una procedura memorizzata potrebbe aiutarmi qui in qualche modo? E come apparirebbe l'SQL per il recupero della proprietà "nome" dell'oggetto 2?
Ottima risposta! Grazie mille :) –
Quale sarebbe quindi una soluzione migliore nel caso in cui l'EAV sia qualcosa da evitare quando si presenta la necessità di nidificare gli oggetti? – ChrisR
Ora con soluzioni NoSQL come MongoDB, gli EAV possono finalmente morire. –