Правильный способ структурировать таблицу в MySQL, чтобы 2 пользователя проверили документ? - PullRequest
1 голос
/ 03 апреля 2020

Подробности:

У меня есть 3 таблицы.

  • Пользователи
  • Запрос
  • Проверка

См. Эту ссылку на скрипку: http://sqlfiddle.com/#! 9 / ac7c95d / 1

Примечание:

Ссылка на скрипку просто черновик - он, вероятно, нуждается в хорошей реструктуризации.

Цель:

Я не уверен, как создать правильную структуру для достижения следующего:

  • 1 пользователь запрашивает просмотр своего файла.

  • 2 других пользователя должны подтвердить запрошенный документ.

  • Если оба пользователя подтвердили его как «Готово», отметьте «Завершено».

  • Если оба пользователя подтвердили как «Не выполнено» пометить как «Отклонено».

  • Если 1 пользователь подтвердил его как «Готово», а другой пользователь «Не выполнено», он будет проверен как «Пометить заново».

Вопрос

Какой хороший способ структурировать это в MySQL? Что бы вы порекомендовали добавить в?

Мое решение, но я думаю, что есть что-то лучшее, чем это:

Я думаю, что для таблицы Request - я могу структурировать это так:

create table request_label_signoff (
    id int not null primary key auto_increment,
    date_requested timestamp,
    user_id int,
    filename varchar(255),
    verify_id_user1 int,
    progress_user1 int,
    verify_id_user2 int,
    progress_user2 int,
    foreign key(verify_id_user1) references verify(id),
    foreign key(verify_id_user2) references verify(id)
);

1 Ответ

1 голос
/ 03 апреля 2020

Я бы, вероятно, сделал

create table request (
    id int not null primary key auto_increment,
    date_requested timestamp,
    user_id int,
    filename varchar(255),
    status enum('new','verified','rejected') not null default 'new',
    foreign key(user_id) references user(id)
);

create table verify (
    id int not null primary key auto_increment,
    user_id int,
    request_id int,
    created timestamp,
    status enum('verified','rejected') not null default 'new',
    foreign key(request_id) references request(id)
);

Если вы хотите обновить статус запроса, можете просто сделать

update request 
inner join (select request_id,count(*) as users from verify where status = 'verified' group by verify having users>1) t2
    on (request.id = request_id) 
set request.status = 'verified'
where request.status = 'new';

update request 
inner join (select request_id,count(*) as users from verify where status = 'rejected' group by verify having users>1) t2
    on (request.id = request_id) 
set request.status = 'rejected'
where request.status = 'new';

Или просто отфильтровать запросы во время запроса (без необходимость «поддерживать» столбец в таблице запросов.

select request.*,count(*) as verified from request  
inner join verify on (request.id = request_id and status = 'verified')
group by request_id
having verified>1

Или может найти непроверенные элементы (для просмотра!

select request.*,count(*) as processed from request  
inner join verify on (request.id = request_id)
group by request_id
having processed<2

ie любой запрос, содержащий менее двух строк в проверке.

Хотя он не имеет дело с одним принять, а один отклонить! .. чтобы получить как минимум два из любого ответа

select request.*,count(*) as processed from request  
inner join verify on (request.id = request_id)
group by request_id,verify.status
having processed<2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...