У меня есть вопрос о передовой практике относительно того, как следует подходить к хранению сложных состояний рабочего процесса для обработки задач в базе данных. Я искал онлайн безрезультатно, поэтому я решил спросить у сообщества, что они считают лучшим.
Этот вопрос возник из того же примера "BoxItem", который я привел в предыдущем вопросе. Этот «BoxItem» отслеживается в моей системе, поскольку на нем выполняются различные задачи. Задача может выполняться в течение нескольких дней и при взаимодействии с человеком, поэтому состояние BoxItem должно сохраняться. Кто выполнил задание (если применимо), и когда задание было выполнено, также необходимо отслеживать.
Сначала я подошел к этому, добавив три поля в таблицу «BoxItems» для каждой задачи, выполняемой человеком в интерактивном режиме:
Есть TaskName Complete
Дата TaskName Complete
Пользователь TaskName Complete
Это работало, когда рабочий процесс был простым ... но теперь, когда он перерос в сложный процесс (> 10 возможных человеческих взаимодействий в потоке ... примерно половина из которых является необязательной, и может или не может быть сделано для BoxItem, в результате чего я начал добавлять поля «Do TaskName » также для этих дополнительных задач), я обнаружил, что то, что должно было быть простой таблицей, теперь имеет 40 или около того полей, полностью выделенных на сохранение этой информации о состоянии.
Я спрашиваю себя, нет ли лучшего способа сделать это ... но я в растерянности.
Моей первой мыслью было создание общей таблицы «BoxItemTasks», в которой определялись задачи, которые могут быть выполнены для данного блока, но мне все равно нужно было бы сохранять информацию о дате и пользователе по отдельности, поэтому это не помогло.
Моя вторая мысль состояла в том, что, возможно, это не имело значения, и я не должен волноваться, если в этой таблице есть 40 или более полей, предназначенных для сохранения состояния ... и, возможно, я просто параноик. Но такое ощущение, что это много информации, которую нужно сохранить.
В любом случае, я в растерянности относительно того, какой может быть третий вариант, или если один из двух вариантов выше действительно оправдан. Я вижу, что этот рабочий процесс может стать еще более сложным в будущем, и для каждой новой задачи мне нужно будет добавить 3-4 поля просто для поддержки его отслеживания ... кажется, что он выходит из-под контроля.
Что бы вы сделали в этой ситуации?
Я должен отметить, что это обслуживание существующей системы, которая была построена без ORM, поэтому я не могу просто оставить это на усмотрение ORM.
EDIT:
Кев, ты говоришь о том, чтобы сделать что-то вроде этого:
BoxItems
(PK) BoxItemID
(Другие не относящиеся к делу вещи)
BoxItemActions
(PK) BoxItemID
(PK) BoxItemTaskID
IsCompleted
DateCompleted
UserCompleted
BoxItemTasks
(PK) TaskType
Описание (если даже необходимо)
Хм ... это бы сработало ... это означало бы необходимость изменить то, как я сейчас подхожу к выполнению SQL-запросов, чтобы увидеть, какие элементы находятся в каком состоянии, но в долгосрочной перспективе что-то вроде этого выглядит так, как будто оно будет работать лучше (без необходимости вносить фундаментальные изменения в дизайн, как представляет идея сериализации ... хотя, если бы у меня было время, я бы хотел сделать это так, как я думаю).
Так это то, о чем вы упоминали, Кин, или я не согласен?
РЕДАКТИРОВАТЬ: Ах, я вижу вашу идею с "Последнее действие", чтобы определить текущее состояние ... Мне нравится! Я думаю, что это может сработать для меня ... Возможно, мне придется немного его изменить (потому что в какой-то момент задачи выполняются одновременно), но идея кажется хорошей!
РЕДАКТИРОВАТЬ ЗАКЛЮЧИТЕЛЬНО: Итак, если подвести итог, то если кто-то еще будет искать это в будущем с тем же вопросом ... похоже, что подход сериализации будет полезен, если ваша система предварительно загрузит информацию в некоторый интерфейс, где она запрашиваемый (то есть не напрямую вызывая саму базу данных, как это делает специальная система, над которой я работаю), но если у вас ее нет, идея дополнительных таблиц выглядит так, как будто она должна работать хорошо! Спасибо всем за ваши ответы!