Gestione della cache durante l'abbinamento dei dati

1

Sto recuperando i valori da 3 tabelle nel database e cercando di farli corrispondere. Mi stavo chiedendo come gestire la cache in modo elegante. Non riesco a modificare la struttura del database anche se una delle tabelle è assurda.

Attualmente sto caricando le mie tabelle dal DB alla cache, una cache per parametro, e poi cerco di trovare il valore esistente in ciascuna cache una dopo l'altra.

Per darti un'idea migliore, ecco un esempio dei miei input

Ho una strana tabella A non 1NF che contiene varie informazioni non dipendenti:

     | Grouping Key       | Grouping Name             | Value |
     | Grp_1              | Foo                       | ABCD  |
     | Grp_2              | Countries                 | UK    |
     | Grp_3              | Time                      | 3am   |
     | Grp_A              | Text                      | A     |
     | Grp_B              | Text                      | AAA   |
     | Grp_C              | Text                      | B     |
     | Grp_D              | Text                      | B+    |
     | Grp_E              | Text                      | B-    |
     | Grp_F              | Text                      | B     |

Mi spiace per questo tavolo, non ha senso, e non posso cambiarlo.

Ho una tabella B che collega i tasti di raggruppamento della tabella precedente a valori numerici. "*" significa "qualsiasi valore".

|Item family number | FooType | Country | Time  | Text  |
|                 1 | Grp_1   | Grp_2   | Grp_3 |   *   | 

Finalmente ho ottenuto una tabella C di oggetti con le loro caratteristiche

| UniqueId | FooType | Country | Time | Text |
| 00001    | ABCD    | UK      |  3am |   A  |

Quello che sto cercando di fare è, data la tabella B, trovare una linea di corrispondenza nella tabella C con l'aiuto della tabella A.

Quello che ho intenzione di fare è caricare una cache per colonna di tabella C con una tupla di UniqueId e questa colonna, dove le tabelle corrispondono.

select a.GroupingKey, c.UniqueId from table_C c join table_A a on a.Value = c.FooType

select a.GroupingKey, c.UniqueId from table_C c join table_A a on a.Value = c.Country

-- same for Time and Text column in Table C.

Cache avrebbe questo aspetto:

-- FooTypeCache 
| GroupingKey | UniqueId |
| Grp_1       | 00001    |

-- CountryCache 
| GroupingKey | UniqueId |
| Grp_2       | 00001    |

Con queste cache caricate, quando leggo una riga della tabella B, sto cercando di trovare un valore corrispondente in ciascuna cache. Mi darebbe per ogni colonna di questa riga della Tabella B un elenco di IDI corrispondenti. Se un unico ID è presente in ognuno di questi possibili elenchi Unici, c'è una corrispondenza tra questa tabella B e la tabella A e C.

Trovo che l'intero processo sia troppo complicato. Sento che dovrebbe esserci una soluzione molto più semplice. Hai qualche idea?

    
posta Calimero 17.07.2018 - 09:42
fonte

1 risposta

1

Questo è qualcosa che dovresti fare a livello di database. SQL è costruito per raccogliere insiemi di dati e trasformarli in altri insiemi di dati. è possibile unire queste tabelle in un unico set che contiene tutte le informazioni utili e memorizzarle nella cache. Ciò ti consente di cercare i tuoi valori chiave solo in un posto, quindi puoi ottenere tutti i valori rilevanti per quella chiave in qualsiasi forma sia più comoda per te.
È necessario memorizzare nella cache solo elementi che hanno valore per te, controllando più valori memorizzati nella cache per ottenere dati utili è un segno che è necessario per rimodellare i dati. Non è necessario modificare la struttura fisica di un database per ottenere dati in un formato utile, è possibile creare query che consentono di leggere i dati in un formato utile e scrivere codice per tradurli nuovamente nel layout fisico per l'inserimento / aggiornamento se richiesto pure. È più lavoro lavorare su un database mal progettato, ma non è necessario rendere tutto più difficile se si astraggono correttamente le incoerenze dal resto della logica.

    
risposta data 17.07.2018 - 14:00
fonte

Leggi altre domande sui tag