Как сделать так, чтобы задачи были перепроверены (как хранить их в БД)?

У меня есть БД, которая хранит различные типы задач и больше элементов в разных таблицах. Во многих из этих таблиц (что их структура различна) мне нужен способ сделать это, чтобы элемент был перепроверен, что означает, что элемент не может быть "сохранен" (я имею в виду, конечно, он будет сохранен) прежде чем кто-то еще входит в программу и подтверждает это.

Какой должен быть правильный способ сказать, какой пункт подтвержден:

  1. В каждой из этих таблиц должен быть столбец "IsConfirmed", затем, когда этот парень хочет подтвердить все данные, программа просматривает все таблицы и создает список элементов, которые не проверены.
  2. Должна быть третья таблица, которая содержит имя таблицы и идентификатор этой строки, которая должна быть подтверждена.
  3. Я надеюсь, что у вас есть идея получше, чем два уродца выше.

2 ответа

Решение

Является ли дважды подтвержденный статус чем-то, что происходит с объектом ровно один раз? Или он может быть отклонен и нуждается в повторном подтверждении? В последнем случае, вам нужно сохранить всю эту историю? Вам нужно отслеживать, кто подтверждал каждый раз (например, чтобы у вас не было одного и того же человека, выполняющего оба подтверждения)?

Простой случай:

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

При первом подтверждении:

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

При втором подтверждении:

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

Когда отклонено:

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

Теперь очевидно, что ваше фоновое задание может обрабатывать только те строки, где Processed = 0 и ConfirmCount = 2. Затем, когда оно обработало эту строку:

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

Если у вас более сложный сценарий, чем этот, предоставьте более подробную информацию, в том числе цели процесса двойного подтверждения.

Попробуйте добавить новую таблицу для хранения записей, которые должны быть подтверждены (например, TasksToBeConfirmed). После подтверждения записей переместите эти записи в постоянную таблицу (Задачи).

Недостаток добавления столбца IsConfirmed заключается в том, что практически каждый оператор SQL, использующий таблицу, должен будет фильтровать IsConfirmed, чтобы предотвратить получение неподтвержденных записей. Каждый раз, когда это пропущено, появляется дефект.

В случаях, когда вам нужны подтвержденные и неподтвержденные записи, используйте UNION.

Этот шаблон - немного больше работы для кодирования и реализации, но, по моему опыту, значительно повышает производительность и уменьшает количество дефектов.

Другие вопросы по тегам