Il modo migliore per eseguire query sui dati MySQL immutabili

0

Ho sempre più utilizzato la memorizzazione dei dati immutabili per la mia app Web, a causa di alcuni vantaggi che ha (scritture più semplici, possibilità di visualizzare cronologia / attività).

Lo faccio usando le dabatase di MySQL, semplicemente facendo solo inserti; nessun aggiornamento / eliminazione; e con l'id (chiave primaria) su ogni riga è un tipo autoincrementante di 'ID transazione' e quindi con una colonna 'ID entità' con un nome appropriato.

Il problema che sto riscontrando è una query di MySQL massicciamente dettagliata per determinati dati ultimi desiderati. Con il tuo database MySQL mutevole standard, non devi preoccuparti di ottenere l'ultima riga per ogni tabella (perché è sempre l'ultima in quanto usano solo gli aggiornamenti). Con dati immutabili sto facendo questa enorme query piena di auto-join, quindi restituisce solo il sottoinsieme di dati che ha l'id più alto.

Ad esempio:

select ...
...
inner join (
    /* latest */
    select y.* from (
      select id,forum_id,optional, max(id) as max_id
      from forum_opt
      group by forum_id
      ) as x
      inner join forum_opt as y
      on y.id = x.max_id
) as forumopt on ...

Mentre prima sarebbe solo:

select ...
...
inner join forum_opt on ...

Quindi c'è un modo più pulito per implementarlo? C'è qualcosa che non sto capendo riguardo a questo concetto di design del software o qualcosa che sto sbagliando?

    
posta Glorfindel 29.09.2017 - 08:29
fonte

1 risposta

2

Sì, c'è un modo più pulito, si chiama database temporali , in particolare "transaction-time" .

L'idea è di utilizzare un valore dell'intervallo [trans_start, trans_end[ per indicare, quando una riga è stata memorizzata o modificata nel database (trans_start) e per quanto tempo è rimasto in questo modo (trans_end). Utilizzando una condizione now between trans_start and trans_end and now <> trans_end , puoi ottenere i valori correnti nella tabella del tuo database. Questo modello consente banalmente le query "as-of", dove il tuo approccio renderebbe molto più difficile. Non così banale, questo modello consente join a tempo pieno, che fornisce la cronologia completa delle modifiche di un join di due o più tabelle con cronologia (anche se le righe sono mutate indipendentemente).

I join sono quindi più facili da formulare, ma conterranno sottoquery come nell'esempio, ma si eviteranno min -operators. YMMV con piani di esecuzione, se il database applica il join e quindi le condizioni o se prima vengono applicate le condizioni e quindi il join.

Alcuni database forniscono questa funzionalità utilizzando opzioni aggiuntive, ad es. In Oracle questo è chiamato FlashBack-query.

Controlla Snodgras 's "Sviluppo di applicazioni database orientate al tempo con SQL", che è disponibile dalla sua pagina (collegata) come PDF (il primo riferimento).

    
risposta data 29.09.2017 - 09:01
fonte

Leggi altre domande sui tag