Progettazione del database con versione "bozza" di dati

4

Il database che sto attualmente costruendo è un database relazionale piuttosto tradizionale, ma c'è un requisito che non mi è chiaro come modellarlo in modo appropriato.

Esistono molte regole di business che vengono tradotte in controlli di coerenza del database (vale a dire che la data A deve essere compresa tra la data B e C o che questo campo non deve essere nullo quando un altro campo è un valore specifico). Il mio problema sorge perché un utente deve essere in grado di lavorare su una versione "bozza" dei dati, consentendo di salvare le modifiche anche se i controlli di coerenza non hanno esito positivo.

Alla fine, un utente può impegnare la bozza, ma solo una volta che tutti i controlli di coerenza passano.

La ragione principale per cui il client desidera questa funzionalità è che possano interrogare il database direttamente per i report e assicurarsi che stiano utilizzando la versione più recente dei dati che è "coerente", ma non impediscono all'utente di entrare dati parziali.

Ho giocato con l'archiviazione del changeset ai dati in JSON in un archivio documenti, e quindi l'applicazione del changeset nel codice quando si tratta di dati di bozza, ma questo rende difficile gestire cose come le relazioni e la creazione / cancellazione di record.

C'è un modo comune per raggiungere questo obiettivo? O qualcuno ha qualche suggerimento su come posso affrontare questo problema in modo diverso?

    
posta adharris 21.07.2014 - 19:55
fonte

2 risposte

4

Questo sembrerà pazzesco, ma creerei un servizio separato che memorizza i dati in un altro set di tabelle, ma quest'altra serie di tabelle non ha avuto alcun controllo di integrità. L'utente farebbe tutto il lavoro parziale lì, e quando erano pronti potevi spostare i loro dati nello schema controllato in una singola transazione.

    
risposta data 21.07.2014 - 20:17
fonte
2

Utilizza una sorta di campo di identificazione per la modalità bozza (IsFinal) nei tuoi record. Questo valore può essere preso in considerazione quando si applicano i criteri di finalizzazione:

If IsFinal then //do a bunch of checks

Puoi farlo nel codice, nei vincoli o nei trigger del database.

    
risposta data 21.07.2014 - 20:10
fonte

Leggi altre domande sui tag