Questa domanda riguarda il refactoring della progettazione del database esistente.
Il mio flusso di dati è
- L'utente genera alcuni dati per le linee di prodotto A, B, C
- I dati vengono salvati nel database una volta
- I dati vengono in seguito recuperati più volte
Il design attuale ha 3 tabelle: data_a , data_b , data_c , dove ogni tabella condivide alcune colonne identiche (nel nome) e alcune che sono univoche per quella linea di prodotti.
Ad esempio, le colonne con lo stesso nome in ogni tabella sono weight , unit_system e poche altre. Le colonne con nomi diversi hanno valori che rappresentano le quantità fisiche della particolare linea di prodotti. Quelli sono denominati utilizzando vari identificatori alfanumerici, come a , b5 , e2 e vi è un diverso insieme di essi per diverse linee di prodotti. Questi set possono condividere elementi, ad esempio b5 può trovarsi in più di una tabella, ma qualcosa come t1 può trovarsi in una tabella ma non nelle altre.
problema
Attualmente quando è necessario aggiungere un valore dire x9 alla linea di prodotti a, vorrei aggiornare lo schema del database per data_a per avere la colonna x9 . Rendo i valori di x9 come 0 per le righe di colonna esistenti e i nuovi record inizieranno a popolare con i valori effettivi di x9 . Quindi aggiorno il codice nelle posizioni pertinenti per inserire x9 nella tabella o recuperarlo dalla tabella.
Design esistente
data_a(id, item_id, shared, different_a)
data_b(id, item_id, shared, different_b)
data_c(id, item_id, shared, different_c)
dovesharedcolonneèungruppodicolonneidenticoinognitabella,mentredifferentsonocolonnechesonodisgiunteinteoria,inquantorappresentano3diverselineediprodotto,mapotrebberoeffettivamentecondividereelementiconnomisimili,comealcuninomidivariabilisonoglistessiperdiverselineediprodotto.
Designproposto
Questoèdovestolottando.Perchénonvedounbuondesignpulitochesiaancheefficiente.Volevoeliminarelanecessitàdimodificareloschemadeldatabaseognivoltacheèstataaggiuntaunanuovavariabileaunalineadiprodotti.Ecredodipoterlofare,mavoglioanchecreareundesignefficiente,enonnevedouno.
Maquestoèilmiotentativo:
Mantienilachiaveprimaria,lachiaveesternaeinomidicolonnecondiviseinunasingolatabella:
data(id,item_id,shared)Creaunasolatabellasoloperlevariabili(levariabilisonoquelletrovateindifferentset):
data_variables(id,item_id,data_id,variable,value)
Nonsonosicurochequestoprogettovarràlapena,perché...Veramentestomemorizzandopiùdati-tuttigliextradata_idotuttiivaloriextraitem_idperciascunnomedivariabile.Esistonoda15a30nomidivariabiliperciascunalineadiprodotti.Memorizzeròicampida15a30item_id(odata_id)nellanuovatabelladata_variablesdesign,dovenelvecchioprogettoc'erasolounitem_idvaloreperrigaditabella.
Domanda:
Esisteunaprogettazionepiùefficientechenonrichiedemodifichenellaprogettazionedelloschemaperogniaggiunta/eliminazione/modificadelnomedellavariabileinunalineadiprodotti?Potrebbeesseremeglioattenersialdesignesistentenonostanteilproblemadialterareloschemaquandoènecessarioaggiungerenuovevariabili?
UtilizzodiJSONpercampi"diversi" variabili
one_data_table(id, item_id, product_line, shared, json_encoded_value_pairs);
Decisione di non utilizzare il modello EAV (Entity-attribute-value)
Nel mio caso le Entità cambiano molto raramente se non del tutto (nell'ordine degli anni), e anche gli attributi cambiano raramente, nell'ordine di mesi o più. Pertanto, rielaborare la progettazione del database per utilizzare EAV non è probabilmente adatto al mio caso.
A parte questo, sto ancora discutendo sul mio JSON Design.
