Php 需要mySQL建议-如何构建特定的mySQL数据库/体系结构-内部示例

Php 需要mySQL建议-如何构建特定的mySQL数据库/体系结构-内部示例,php,mysql,sql,Php,Mysql,Sql,我需要一些关于如何建立我的数据库的建议。我将告诉你一个通用的例子,它应该如何工作 因此,该网站将有数千名用户-[1个表用户,我猜他们的详细信息-好这里] 假设每天都会有一些问题/事实由管理员发布,用户可以选择其中一个答案,例如1,2,3。每个用户都可以选择每个问题的一个答案。 [1我猜有问题的表格-或者问题可以是独立的表格,具体取决于月份或年份?] 每个对特定问题(例如问题/事实)做出选择的用户都将存储其答案。因此,一个简单的想法是有一个新表来存储它。例如,用户1和问题54,答案1 但是如果用户

我需要一些关于如何建立我的数据库的建议。我将告诉你一个通用的例子,它应该如何工作

因此,该网站将有数千名用户-[1个表用户,我猜他们的详细信息-好这里]

假设每天都会有一些问题/事实由管理员发布,用户可以选择其中一个答案,例如1,2,3。每个用户都可以选择每个问题的一个答案。
[1我猜有问题的表格-或者问题可以是独立的表格,具体取决于月份或年份?]

每个对特定问题(例如问题/事实)做出选择的用户都将存储其答案。因此,一个简单的想法是有一个新表来存储它。例如,用户1和问题54,答案1

但是如果用户是数千人,那么想象一下每天30-40个问题/事实*数千个答案*几天/几年等等。我想这太慢了

另一个想法是为每个用户创建一个表,但我认为这真的很糟糕

想象一下,我需要检索答案的历史记录,并在其他模块上快速使用这些数据。随着时间的推移,拥有一个有百万条或无限条目的表对搜索来说是不好的,对吧


表格设置将是少写多读。因为整个站点都需要读取。对于回答最成功的用户。您个人资料中所有答案的历史记录。每个问题类别都有正确答案的顶级用户(不同类别的问题我忘了说-所以可能每个类别都有新的表格?大约5-10个或类似数量的类别)每月和每年的统计数据。过去几年仅用于历史目的,所以不会有太多的阅读。(所以也许分类也有每年的表格?)这都是关于每个用户的统计数据

所以我的问题是,你认为我应该如何构建它

提前谢谢


我愿意接受更多的想法。
也忘了问PHP+MySQL或ASPX+MSSQL?< /P> < P>我想做的是有一个问题表和一个响应表。 每个问题都有自己的唯一ID,该ID也会出现在回答表中

问题
的示例布局为:
问题ID、文本、响应值
响应
的示例布局为
问题ID、用户ID、响应ID

这类关系称为“.”。

您可能还想重温一下“一对多”关系。

一般来说,设计良好的数据库在查询包含数百万条记录的表时与查询包含数千条记录的表时速度大致相同,只要您可以使用索引访问数据即可

另一方面,一旦在需要之前进行了性能优化,维护成本就会迅速上升

因此,我建议将数据库设计为便于开发人员理解、编写性能测试,并且仅在您真正需要时进行优化

关于你的具体问题:

Table USERS
user_id (primary key)
name
...

table QUESTIONS
question_id (primary key)
question_date
question_text

table ANSWERS
answer_id (primary key)
question_id (foreign key to questions)
answer_text

table user_answers
user_id (foreign key to users)
answer_id (foreign key to answers)
is_correct_flag
在所有键上创建索引,并且(可能)在查询日期上创建索引;如果需要按用户名搜索,也可以在该列上创建索引

现在,用SQL编写数据访问查询—不必完全正确,只要足够好,就可以让您进行测试。然后使用一个测试数据生成器来填充您的表-我在过去使用过DBMonster。将两倍于预期需要的数据放入数据库

现在执行数据访问查询,并测量响应时间。以不同的顺序多次执行此操作-数据库上的缓存等可能会产生误导性结果。我发现使用单元测试框架(如PHPUnit)封装这些测试非常有用,这样,您可以多次重新运行相同的测试

如果幸运的话,您根本不会有任何性能问题。如果没有,请使用EXPLAIN优化查询。如果这不起作用,考虑更好的硬件。如果这不起作用,请创建预先计算的“报告表”,将通常请求的数据聚合到一个简单的平面结构中,并在批处理或数据更改时进行更新

例如,如果您必须报告一段时间内的用户分数,您可以按照以下行创建一个表:

table USER_SCORE_PERIOD_REPORT
user_id
username
period
score
我喜欢遵循命名约定,以确保这些“报告表”被清楚地标识,并且不会被误认为是常规的“事务”表


但实际上,只有当您知道自己有性能问题时,才可以这样做-此解决方案会创建更多可能出现故障的东西,并有更多的机会出现错误

首先感谢你的回答。这是我的第一个想法,正如我上面所说的。在您提到的RESPONSES表中,RESPONSE_ID是用户选择的RESPONSE_值?(3种方法中的1种)无论如何,这种方法可能很慢?它可能很慢,但如果取决于表的设置方式(少写、多读或少读、多写),您可能能够以这种方式(可能通过
QUESTION\u ID
USER\u ID
)对它进行索引,以加速对您将要使用它的内容的访问。如果处理是一个大问题,您总是可以定期更新结果,而不是每次访问,但大多数情况下,您只需要为给定问题选择给定响应的次数。同样,它确实取决于设置和需要。表设置将是少量写入,实际上是大量读取。因为整个站点都需要读取。对于回答最成功的用户。您个人资料中所有答案的历史记录。每个问题类别都有正确答案的顶级用户(不同类别的问题我忘了说-所以可能每个类别都有新的表格?大约5-10个或类似数量的类别)每月和每年的统计数据。过去几年仅用于历史目的,所以不会有太多的阅读。(那么也许每年的分类也有表格?)