mySQL数据对每个用户都是唯一的

时间:2013-03-12 12:49:06

标签: php mysql cakephp

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

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

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

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

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

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

我在关系设计方面经验丰富,但在最好的方式上有点难以理解,并且同时为自己辩护。

**Mock Structure**
Steps
id
name
order
desc


**Users**
id
username


**Step_Users**
step_id
user_id
result1
result2
result3

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

**Step_Users**
step_id
user_id
result

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

答案 2 :(得分:0)

我会这样打破它:

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

我建议将一个布尔值放入Userssteps_finished。这样,您可以在瞬间知道,只需从用户表中提取,无论它们是否已被标记为已完成。此外,除非您需要,否则将来对步骤的更改不会影响用户。

注册或登录时请执行以下步骤:

  1. 用户注册新帐户:steps_finished = false或用户登录帐户。
  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 = true)
  6. 下一页提交

    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。
    4. 有很多理由要检查表中的行相互对比'但最大的原因是用户可能会停止在中间执行步骤,并且您需要一种方法可以在他们开始的位置向右跳。< / p>