Come eseguire le attività a doppio controllo (come conservarlo nel DB)?
-
22-09-2019 - |
Domanda
Ho un DB che memorizza diversi tipi di compiti e più articoli in diverse tabelle. In molte di queste tabelle (che la loro struttura è diversa) ho bisogno di un modo per farlo che l'oggetto deve essere ricontrollato, il che significa che l'oggetto non può essere "salvato" (intendo ovviamente che verrà salvato) Prima che qualcun altro entri nel programma e lo conferma.
Quale dovrebbe essere il modo giusto per dire quale articolo è confermato:
- Ognuna di queste tabelle dovrebbe avere una colonna "è confermata", quindi quando quel ragazzo vuole confermare tutte le cose, il programma attraversa tutte le tabelle e crea un elenco degli elementi che non sono controllati.
- Dovrebbe esserci una terza tabella che contiene il nome della tabella e l'ID di quella riga che deve essere confermato.
- Spero che tu abbia un'idea migliore dei due brutti sopra.
Soluzione
Lo stato confermato a doppia conferma è qualcosa che accade esattamente una volta per un'entità? O può essere respinto e è necessario eseguire nuovamente la conferma? In quest'ultimo caso, devi mantenere tutta questa storia? Devi tenere traccia di chi ha confermato ogni volta (ad esempio, in modo da non avere la stessa persona che esegue entrambe le conferme)?
Il caso semplice:
ALTER TABLE dbo.Table ADD ConfirmCount TINYINT NOT NULL DEFAULT 0;
ALTER TABLE dbo.Table ADD Processed BIT NOT NULL DEFAULT 0;
Quando la prima conferma:
UPDATE dbo.Table SET ConfirmCount = 1 WHERE PK = <PK> AND ConfirmCount = 0;
Su seconda conferma:
UPDATE dbo.Table SET ConfirmCount = 2 WHERE PK = <PK> AND ConfirmCount = 1;
Quando rifiutato:
UPDATE dbo.Table SET ConfirmCount = 0 WHERE PK = <PK>;
Ora ovviamente il tuo lavoro di fondo può trattare solo le righe dove elaborato = 0 e ConfermCount = 2. Quindi quando ha elaborato quella riga:
UPDATE dbo.Table SET Processed = 1 WHERE PK = <PK>;
Se hai uno scenario più complesso di questo, fornisci maggiori dettagli, inclusi gli obiettivi del processo a doppio contraffazione.
Altri suggerimenti
Prendi in considerazione l'aggiunta di una nuova tabella per contenere i record (ad esempio TaskStobeConfizzato). Una volta confermati i record, sposta quei record sulla tabella permanente (compiti).
Lo svantaggio di aggiungere una colonna "ISCONFERAD" è che praticamente ogni istruzione SQL che utilizza la tabella dovrà filtrare "ISCONFERED" per evitare che ottenere record non confermati. Ogni volta che questo manca, viene introdotto un difetto.
Nei casi in cui è necessario registri confermati e non confermati, utilizzare Union.
Questo modello è un po 'più di lavoro per codificare e implementare, ma nella mia esperienza migliora significativamente le prestazioni e riduce i difetti.