Pergunta

Eu tenho um banco de dados que armazena diferentes tipos de tarefas e mais itens em tabelas diferentes. Em muitas dessas tabelas (que sua estrutura é diferente), preciso de uma maneira de fazê-lo para que o item tenha que ser verificado duas vezes, o que significa que o item não pode ser 'salvo' (quero dizer, é claro que será salvo) Antes de alguém entrar no programa e confirmar.

Qual deve ser o caminho certo para dizer qual item está confirmado:

  1. Cada uma dessas tabelas deve ter uma coluna "IsConfirmed"; então, quando esse cara quer confirmar todas as coisas, o programa caminha por todas as mesas e cria uma lista dos itens que não são verificados.
  2. Deve haver uma terceira tabela que mantém o nome da tabela e o ID dessa linha que deve ser confirmada.
  3. Espero que você tenha uma ideia melhor do que os dois feijos acima.
Foi útil?

Solução

O status de confirmação dupla é algo que acontece exatamente uma vez para uma entidade? Ou pode ser rejeitado e precisa passar pela confirmação novamente? No último caso, você precisa manter toda essa história? Você precisa acompanhar quem confirmou cada vez (por exemplo, para não ter a mesma pessoa realizando as duas confirmações)?

O caso simples:

ALTER TABLE dbo.Table ADD ConfirmCount TINYINT NOT NULL DEFAULT 0;
ALTER TABLE dbo.Table ADD Processed BIT NOT NULL DEFAULT 0;

Quando a primeira confirmação:

UPDATE dbo.Table SET ConfirmCount = 1 WHERE PK = <PK> AND ConfirmCount = 0;

Na segunda confirmação:

UPDATE dbo.Table SET ConfirmCount = 2 WHERE PK = <PK> AND ConfirmCount = 1;

Quando rejeitado:

UPDATE dbo.Table SET ConfirmCount = 0 WHERE PK = <PK>;

Agora, obviamente, seu trabalho de fundo só pode tratar linhas onde processado = 0 e ConfirmCount = 2. Então, quando processou essa linha:

UPDATE dbo.Table SET Processed = 1 WHERE PK = <PK>;

Se você tem um cenário mais complexo do que isso, forneça mais detalhes, incluindo os objetivos do processo de confirmação dupla.

Outras dicas

Considere adicionar uma nova tabela para manter os registros a serem confirmados (por exemplo, TaskStoBeconFirmed). Depois que os registros forem confirmados, mova esses registros para a tabela permanente (tarefas).

A desvantagem de adicionar uma coluna "IsCon -Incirmed" é que praticamente todas as instruções SQL que usam a tabela terão que filtrar "ISConfirmed" para impedir a obtenção de registros não confirmados. Toda vez que isso é perdido, um defeito é introduzido.

Nos casos em que você precisa de registros confirmados e não confirmados, use a Union.

Esse padrão é um pouco mais de trabalho para codificar e implementar, mas, na minha experiência, melhora significativamente o desempenho e reduz os defeitos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top