#database #database-design #language-agnostic
Вопрос:
Допустим, у меня есть база данных, в которой я храню задачи пользователей.
Для упрощения предположим, что задача имеет:
- ID
- статус (Новый, Предстоит сделать, В процессе, Сделано, Отклонено)
- Описание
- владелец/создатель
Теперь я хочу добиться того, чтобы, когда пользователь завершает задачу — делает ее выполненной или отклоненной, я хочу, чтобы пользователь предоставил некоторую информацию об изменении этого состояния. Я представляю всплывающее окно с двумя полями: одно для выбора из статусов «Сделано» / «Отклонено» и область текстового поля для заполнения причины, если хотите.
Проблема, с которой я столкнулся здесь, заключается в следующем: как я могу хранить информацию о завершении задачи?
Моя идея состоит в том, чтобы создать таблицу, подобную task_completions
той, которая будет иметь:
- ID
- идентификатор задачи
- комментарий (varchar или что-то еще)
Теперь дело в следующем: когда я загружаю задачу для пользователя из базы данных и вижу, что она завершена (опять же, выполнена или отклонена) Мне нужно загрузить информацию о завершении задачи. Таким образом, это приведет к двум вызовам API:
- получить задание
- получить task_completion, где
task_completion.task_id == task_id
Конечно, есть и другой способ — я могу добавить поле task_completion в свою task
таблицу. И, конечно, сделайте его недействительным, так как он не будет заполнен ничем, пока задача не будет завершена. И тогда мне не придется принять две вызовов API, так как при использовании что-то вроде Django сериализаторы (или что-то вроде этого), у меня будет возможность «расширить» task_completion
поле от простой номер (идентификатор task_completion
) колонки для полного вложенный JSON с информацией о завершении (идентификатор, task_id, комментарий) — Мне просто нужно позвонить get task
. И тогда мне даже не нужно указывать task_id
поле в task_completion
таблице.
Итак, подводя итог, я думаю, что у меня есть 3 варианта:
task
иtask_completion
таблицы, гдеtask_completion
таблица содержитtask_id
столбец — два вызова APItask
иtask_completion
таблицы, гдеtask
таблица содержитtask_completion_id
столбец — один вызов API, если я все сделаю правильноtask
иtask_completion
таблицы, гдеtask
таблица содержитtask_completion_id
столбец, аtask_completion
таблица содержитtask_id
столбец — я думаю, все еще один вызов API, — но имеет ли смысл иметь оба этих столбца в этих таблицах?
Комментарии:
1. Разве вы не можете просто поместить
comment
в своюtask
таблицу столбец, допускающий обнуление?2. Я могу, но если бы я хотел расширить этот комментарий, скажем, чтобы он содержал человека, который закрыл задачу, или что-то еще, это создало бы беспорядок в
task
таблице3. Справедливое замечание. Может ли задача быть открыта повторно или для каждой задачи может быть выполнено только одно завершение?
4. Я как бы подражаю поведению Джиры, так что задача потенциально может быть возобновлена
5. Первый выбор (
task_completion
таблица сtask_id
task
таблицей ссылок на столбцы) более правильный, так как для каждого из них может быть более одного завершенияtask
. Но я предлагаю вместо этого какуюtask_status_history
-нибудь таблицу, так как вам, вероятно, понадобится история изменений. Я действительно не знаю django, поэтому не могу комментировать количество вызовов api, но, если это не очень дорого, не имеет значения, один или два.