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:

  1. 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.
  2. Dovrebbe esserci una terza tabella che contiene il nome della tabella e l'ID di quella riga che deve essere confermato.
  3. Spero che tu abbia un'idea migliore dei due brutti sopra.
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top