Il problema è simile a questa domanda , ma non a un duplicato. Quello che sto cercando è una soluzione migliore di quella attuale.
Sto costruendo un'applicazione web per un dipartimento nella mia università e, a causa di come funziona il college, le cose devono essere archiviate ogni semestre. Per archivio, intendo contrassegnato come non "corrente" in modo che tutto ciò che si è verificato nei semestri precedenti sia fuori mano, ma accessibile tramite qualcosa come /projects/archive
se necessario.
Al momento, ho una semplice colonna archiviata booleana per ogni tabella che deve essere archiviata (utenti, progetti, eventi, ecc.). Prima che inizi il nuovo semestre, eseguo uno script che capovolge lo switch per tutte le righe in cui archived = FALSE
. Non è l'approccio peggiore.
Il problema è che quando vengono create sempre più tabelle, il mio senso di DRY inizia a formicolare, dicendo che una colonna archiviata per ogni tabella è ridicola . Lo script cresce (di una riga) per ogni tabella che necessita di una colonna archiviata.
Fortunatamente sto usando il framework Rails, quindi lo script di archivio ha il seguente aspetto:
User.where(role: [User.roles[:faculty], User.roles[:student]], archived: false).update_all(archived: true)
Course.where(archived: false).update_all(archived: true)
Enrollment.where(archived: false).update_all(archived: true)
Project.where(archived: false).update_all(archived: true)
Event.where(archived: false).update_all(archived: true)
Occorrono solo pochi secondi (le tabelle sono piuttosto piccole) e devono essere eseguite solo 4 volte all'anno. Devo notare che non si tratta di dati di classe enterprise con i quali ho a che fare. La tabella più grande è iscrizione che ha solo circa 5000 righe aggiunte per semestre (ovvero ~ 125.000 righe dopo 10 anni).
È una soluzione accettabile, o ce n'è una migliore? Se, ad esempio, si trattasse di dati a livello di Facebook con cui avevo a che fare, l'approccio dovrebbe essere diverso?