我正在使用MySQL / cakePHP构建一个应用程序,它涉及以下要求。
管理员创建用户需要完成的步骤。例如是/否类型问题。管理员创建这些步骤,新用户应该获得这些步骤。
用户登录时需要完成所有这些步骤。
我的问题是在数据库(mySQL)中执行此操作的最佳方法是什么
当用户注册时,它会查询步骤表并为该用户的每个步骤创建新行?它通过查看步骤表来从服务器端代码创建行?
创建一个新的临时表来存储到关系??
我在关系设计方面经验丰富,但在最好的方式上有点难以理解,并且同时为自己辩护。
**Mock Structure**
Steps
id
name
order
desc
**Users**
id
username
**Step_Users**
step_id
user_id
result1
result2
result3
答案 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
中的行)。
我建议将一个布尔值放入Users
表steps_finished
。这样,您可以在瞬间知道,只需从用户表中提取,无论它们是否已被标记为已完成。此外,除非您需要,否则将来对步骤的更改不会影响用户。
注册或登录时请执行以下步骤:
steps_finished
= false或用户登录帐户。 steps_finished
= true,则忽略其余部分。如果为false,继续。 select * from Step_Users where user_id=X order by step_id
select * from Steps order by id
steps_finished
= true)下一页提交
select * from Step_Users where user_id=X and step_id=Y
有很多理由要检查表中的行相互对比'但最大的原因是用户可能会停止在中间执行步骤,并且您需要一种方法可以在他们开始的位置向右跳。< / p>