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)
doveshared
colonneèungruppodicolonneidenticoinognitabella,mentredifferent
sonocolonnechesonodisgiunteinteoria,inquantorappresentano3diverselineediprodotto,mapotrebberoeffettivamentecondividereelementiconnomisimili,comealcuninomidivariabilisonoglistessiperdiverselineediprodotto.
Designproposto
Questoèdovestolottando.Perchénonvedounbuondesignpulitochesiaancheefficiente.Volevoeliminarelanecessitàdimodificareloschemadeldatabaseognivoltacheèstataaggiuntaunanuovavariabileaunalineadiprodotti.Ecredodipoterlofare,mavoglioanchecreareundesignefficiente,enonnevedouno.
Maquestoèilmiotentativo:
Mantienilachiaveprimaria,lachiaveesternaeinomidicolonnecondiviseinunasingolatabella:
data(id,item_id,shared)
Creaunasolatabellasoloperlevariabili(levariabilisonoquelletrovateindifferent
set):
data_variables(id,item_id,data_id,variable,value)
Nonsonosicurochequestoprogettovarràlapena,perché...Veramentestomemorizzandopiùdati-tuttigliextradata_id
otuttiivaloriextraitem_id
perciascunnomedivariabile.Esistonoda15a30nomidivariabiliperciascunalineadiprodotti.Memorizzeròicampida15a30item_id
(odata_id
)nellanuovatabelladata_variables
design,dovenelvecchioprogettoc'erasolounitem_id
valoreperrigaditabella.
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.