0

我正在使用 MySQL/cakePHP 构建一个应用程序,其中涉及以下要求。

  • 管理员创建用户需要完成的步骤。例如是/否类型的问题。管理员创建这些步骤,新用户应该得到它们。

  • 用户在登录时需要完成所有这些步骤。

我的问题是在数据库(mySQL)中执行此操作的最佳方法是什么

  • 当用户注册时,它会查询步骤表并为该用户的每个步骤创建新行?它通过查看步骤表从服务器端代码创建行?

  • 创建一个新的临时表来存储关系?

我在关系设计方面相当有经验,但同时对做到这一点的最佳方法和未来证明自己有点难过。

**Mock Structure**
Steps
id
name
order
desc


**Users**
id
username


**Step_Users**
step_id
user_id
result1
result2
result3
4

3 回答 3

1

基本上你的桌子很好。这是一种情况:有人注册。您从表中执行所有步骤Steps并使用此字段创建一个表单。用户填写表格并提交。然后你把这些答案写到一张step_user桌子上。并且以某种方式保留用户已完成答案的信息(可能是某个地方的另一个字段,或者只是检查 step_user 表中是否有他的行)。当然,根据您的确切需求,有不同的方法来处理这个问题。因为您没有提到更多细节,所以我可以在这里提到更多场景,但不确定它们是否会有所帮助。
如果您想确保每个用户的每个步骤都有唯一的数据,那么您应该从表 step_user 中对 step_id 和 user_id 列创建一个复合唯一索引http://www.w3schools.com/sql/sql_unique.asp,但当然您还需要代码来检查这一点。

于 2013-03-12T13:09:33.460 回答
0

我也是这样设计的。只是,为了以后满足不同数量的步骤(问题),也许将 Steps 保存为每个问题的一条记录,并对 Step_users 表执行相同的操作:

**Step_Users**
step_id
user_id
result

如果需要,您可以在用户完成所有步骤时设置的用户表中添加一个标志。

于 2013-03-12T13:09:13.310 回答
0

我会这样分解:

Steps我假设您在表格中为流程中的每个步骤都有一行。Users对于系统中的每个用户,您在表中都有一行。因此,Step_Users表中的行数应该是 (rows in Steps) * (rows in Users)。

我建议将一个布尔值放入Users表中,即steps_finished. 这样,您只需从用户表中拉出,就可以立即知道他们是否已被标记为已完成。此外,除非您愿意,否则将来对步骤的更改不会影响用户。

注册或登录时请按照以下步骤操作:

  1. 用户注册一个新帐户: steps_finished= false 或用户登录到一个帐户。
  2. 如果steps_finished= true,则忽略其余部分。如果为假,请继续。
  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 步中的行中没有遗漏任何内容,则执行 set steps_finished= true )

下一页提交

  1. 一旦他们给出了该步骤的结果,select * from Step_Users where user_id=X and step_id=Y
  2. 如果该结果返回为 0 行,那么您知道他们之前没有提交此步骤。`插入 Step_Users (step_id, user_id, result1, result2, result3) 值 (X, Y, 'response1', 'response2', 'response3')
  3. 再次执行上述步骤 3-5。

将表中的行相互检查有很多原因,但最大的原因是用户可能会在中间停止执行这些步骤,并且您需要一种方法可以直接跳回到它们开始的位置。

于 2013-03-12T13:09:48.203 回答