Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为多个用户存储100个课程状态的优雅/高效方法是什么?_Php_Mysql_Logic - Fatal编程技术网

Php 为多个用户存储100个课程状态的优雅/高效方法是什么?

Php 为多个用户存储100个课程状态的优雅/高效方法是什么?,php,mysql,logic,Php,Mysql,Logic,我正在用JavaScipt、jQuery、PHP和MySQL开发一个应用程序,它包含了大约100节课。我试图想出一种有效的方法来存储每个用户在课程中的进度状态,而不必过多地查询MySQL数据库 现在,我认为最简单的实现是为每个用户创建一个表,然后将每个课程的状态存储在该表中。唯一的问题是,如果我添加新课程,我将不得不更新每个用户的表 我考虑的第二个实现是将每个课程存储为一个表,并记录完成该课程的每个用户的用户ID——但是生成一个状态报告(用户完成了哪些课程,他们做得如何,等等)意味着从100个表

我正在用JavaScipt、jQuery、PHP和MySQL开发一个应用程序,它包含了大约100节课。我试图想出一种有效的方法来存储每个用户在课程中的进度状态,而不必过多地查询MySQL数据库

现在,我认为最简单的实现是为每个用户创建一个表,然后将每个课程的状态存储在该表中。唯一的问题是,如果我添加新课程,我将不得不更新每个用户的表

我考虑的第二个实现是将每个课程存储为一个表,并记录完成该课程的每个用户的用户ID——但是生成一个状态报告(用户完成了哪些课程,他们做得如何,等等)意味着从100个表中提取数据

有没有一个明显的解决方案我错过了?您将如何存储用户在100个课程中的进度,以便快速而简单地生成显示其流程的状态报告


干杯 显然,如果要同时针对任意数量的用户运行报告,单独的数据文件将变得效率低下

抛开效率参数,json还将为您提供一种非常人性化的可读性和可互换的格式


最后,如果报表输出的安全性不是一个大问题,那么您还可以轻松地将视图渲染转移到客户端。

如果一次只能报告一个用户,即在生成报表时,它是针对特定用户而不是大量用户——为什么不考虑存储在文件中的JavaScript对象表示法呢?若可扩展性是关键,那个么它就简单了

显然,如果要同时针对任意数量的用户运行报告,单独的数据文件将变得效率低下

抛开效率参数,json还将为您提供一种非常人性化的可读性和可互换的格式


最后,如果报表输出的安全性不是一个大问题,您还可以轻松地将视图呈现转移到客户端。

使用两个表之间的关系。一个用于具有用户特定列的用户,如ID、用户名、电子邮件、w/e以及其他您要存储的关于他们的信息。 然后是具有UID外键的状态表。ID UID状态等

在表上保持datecreated和dateupdate也是很好的


然后只需连接status.UID=users.ID上的表即可使用两个表之间的关系。一个用于具有用户特定列的用户,如ID、用户名、电子邮件、w/e以及其他您要存储的关于他们的信息。 然后是具有UID外键的状态表。ID UID状态等

在表上保持datecreated和dateupdate也是很好的


然后只需将status.UID=users.ID上的表连接起来即可。一个好的选择是创建一个表,其中用户ID作为主键,表的每一行代表一个用户。访问它的进度会很快,因为您有一个用户ID索引


这样,添加新的leasson不会使您更改de DB

一个好的选择是创建一个表,其中用户ID作为主键,表中的每一行代表一个用户。访问它的进度会很快,因为您有一个用户ID索引


这样,添加新的Leasson不会使您更改de DB

我建议的表结构是保留一个包含非唯一字段
userid
lessonid
以及相关进度字段的表。当您需要第
y
课上用户
x
的进度时,您可以执行以下操作:

SELECT * FROM lessonProgress WHERE userid=x AND lessonid=y LIMIT 1;

你不需要担心性能,除非你发现它实际上是一个问题。为每个用户设置一个表或为每节课设置一个表是不好的解决方案,因为数据库中的表并不一定是动态的。

我建议的表结构是保留一个表,其中包含非唯一字段
userid
lessonid
,以及相关的进度字段。当您需要第
y
课上用户
x
的进度时,您可以执行以下操作:

SELECT * FROM lessonProgress WHERE userid=x AND lessonid=y LIMIT 1;

你不需要担心性能,除非你发现它实际上是一个问题。为每个用户设置一个表或为每节课设置一个表都是糟糕的解决方案,因为数据库中的表数不一定是动态的。

我认为您将表与行弄乱了我认为您将表与行弄乱了是的,我没有想过这一点。。。一个完整的状态表。非常感谢。啊,是的,我没有想过这个。。。一个完整的状态表。非常感谢。非常感谢你。这正是我错过的逻辑——干杯,非常感谢。这正是我错过的逻辑——干杯这是个好主意。我已经用这种格式存储了课程内容,所以也许我会用这种方法来缓存和显示数据,直到数据发生变化,然后用上面提到的userid/status表重新填充文件。谢谢你的反馈,Jeremy。这是一个好主意。我已经用这种格式存储了课程内容,所以也许我会用这种方法缓存和显示数据,直到数据发生变化,然后用上面提到的userid/status表重新填充文件。谢谢你的反馈,Jeremy。