2013-03-12 3 views
0

Я создаю приложение с использованием MySQL/cakePHP, которое включает в себя следующие требования.данные mySQL, уникальные для каждого пользователя

  • Администраторы создают шаги, которые должны быть выполнены пользователями. например да/нет. Админы создают эти шаги, и новые пользователи должны их получить.

  • Пользователи должны выполнить все эти шаги при входе в систему.

Мой вопрос: что бы лучший способ сделать это в базе данных (MySql)

  • Когда пользователь подписывает он запрашивает таблицу шагов и создает новые строки для каждого шага для этот пользователь? Он создает строки из кода на стороне сервера, просматривая таблицу шагов?

  • Создать новую промежуточную таблицу для хранения отношений?

Я довольно опытен вокруг реляционного дизайна, но немного зациклен на наилучшем способе сделать это и будущим доказательством в то же время.

**Mock Structure** 
Steps 
id 
name 
order 
desc 


**Users** 
id 
username 


**Step_Users** 
step_id 
user_id 
result1 
result2 
result3 

ответ

1

В принципе, ваши столы в порядке. Вот один сценарий: кто-то подписывается. Вы делаете все шаги из таблицы Steps и создаете форму с этими полями. Пользователь заполняет форму и отправляет ее. Затем вы пишете ответы на таблицу . И каким-то образом вы сохраняете информацию о том, что пользователь завершил ответы (возможно, другое поле где-то или просто проверьте, есть ли в нем строки в таблице step_user). Конечно, существуют разные подходы к решению этого вопроса, основанные на точных потребностях, которые у вас есть. Поскольку вы не упомянули больше деталей, я мог бы упомянуть больше сценариев здесь, но не уверен, что они помогут.
Если вам нравится быть уверенным, что каждый пользователь имеет уникальные данные для каждого шага, то из таблицы step_user вы должны сделать составной уникальный индекс по столбцам step_id и user_id http://www.w3schools.com/sql/sql_unique.asp, но, конечно, вам также нужен код для проверки этого.

0

Вот как я мог бы это сделать. Просто, чтобы удовлетворить различные количества шагов (вопросы) позже, возможно, сохранить шаги в качестве одной записи на вопрос, и сделать то же самое для Step_users стола:

**Step_Users** 
step_id 
user_id 
result 

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

0

я бы разбить его так:

У вас есть, я полагаю, одна строка в таблице Steps для каждого шага в этом процессе. У вас есть одна строка в таблице Users для каждого пользователя в системе. Таким образом, количество строк в таблице Step_Users должно быть (строки в Steps) * (строки в Users).

Я бы порекомендовал поставить логическое значение в таблицу Users, которая является steps_finished. Таким образом, вы можете узнать в одно мгновение, просто от вытаскивания из таблицы пользователей, независимо от того, были ли они отмечены как завершенные. Кроме того, будущие изменения шагов не будут влиять на пользователя, если вы этого не хотите.

Выполните этот шаг при регистрации или входа в систему:

  1. Пользователь регистрирует новую учетную запись: steps_finished = ЛОЖЬ или пользователь входит в учетную запись.
  2. Если steps_finished = true, то игнорировать остальную часть этого. Если false, продолжайте.
  3. система делает select * from Step_Users where user_id=X order by step_id
  4. система делает select * from Steps order by id
  5. граф через ряды на шаге 3, и сравнить их ряды в шаге 2. Когда вы найдете ряд на шаге 3, не в строках на этапе 2, дайте им этот шаг. (Если вы получите через всю таблицу с шага 3, и ни один не хватает из строк в шаге 2, затем установите steps_finished = истина)

ВПЕРЕД ПРЕДСТАВЛЕНИЕ

  1. После того, как они дают результат для этот шаг,
  2. Если этот результат возвращается как 0 строк, то вы знаете, что они не представили этот шаг раньше. `insert into Step_Users (step_id, user_id, result1, result2, result3) значения (X, Y, 'response1', 'response2', 'response3')
  3. Повторите шаги 3-5 выше.

Существует множество причин, чтобы проверять строки в таблицах друг на друга. «Но самое большое - это то, что пользователь может перестать делать шаги посередине, и вам понадобится способ вернуться прямо туда, где они начал.

Смежные вопросы