Как сделать так, чтобы задачи были перепроверены (как хранить их в БД)?
У меня есть БД, которая хранит различные типы задач и больше элементов в разных таблицах. Во многих из этих таблиц (что их структура различна) мне нужен способ сделать это, чтобы элемент был перепроверен, что означает, что элемент не может быть "сохранен" (я имею в виду, конечно, он будет сохранен) прежде чем кто-то еще входит в программу и подтверждает это.
Какой должен быть правильный способ сказать, какой пункт подтвержден:
- В каждой из этих таблиц должен быть столбец "IsConfirmed", затем, когда этот парень хочет подтвердить все данные, программа просматривает все таблицы и создает список элементов, которые не проверены.
- Должна быть третья таблица, которая содержит имя таблицы и идентификатор этой строки, которая должна быть подтверждена.
- Я надеюсь, что у вас есть идея получше, чем два уродца выше.
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.
Этот шаблон - немного больше работы для кодирования и реализации, но, по моему опыту, значительно повышает производительность и уменьшает количество дефектов.