【发布时间】:2011-07-10 16:53:09
【问题描述】:
我们有一个网络项目,有一些选择题,注册用户回答它们...
我想找到两个用户的共同答案来进行比较。我的意思是,登录的用户将转到其他用户的个人资料页面,并仅查看他们对常见问题的答案的比较...
表格如下(简化):
问题
身份证
问题
活动 -> 枚举('Y', 'N')
答案
身份证
question_id
回答
用户
身份证
尼克
user_answers
用户ID
question_id
answer_id
私人 -> 枚举('Y','N')
我可以通过提供别名来加入 user_answers 表,但我也必须加入其他表。不应考虑私人答案,只应考虑主动问题...
该网站预计会获得一些负载,所以我担心连接太多以及在哪里条件。根据我的经验,我知道这些复杂的查询会锁定表并导致一些严重的性能问题,尤其是在高负载下...
那么当考虑到可扩展性和性能时,最佳实践是什么... 会smt。像狮身人面像或太阳能帮助,或任何基于软件的解决方案来进行比较?
结果会顺便分页...
现在我正在考虑将问题详细信息和答案详细信息分开并缓存它们,因此查询将是 smt。喜欢:
select ua1.answer_id as her_answer_id,
ua2.answer_id as my_answer_id,
ua1.question_id
from user_answers ua1
inner join users_answers ua2 on ua1.question_id=ua2.question_id
where ua1.user_id=$herId
and ua2.user_id=$myId
and ua1.private='N'
order by ua1.question_id desc
questions.question 和 answers.answer 将从缓存中获取...在这种情况下,被动问题将是一个问题,但我想我会尝试将被动问题转移到一些备份数据库中,这会使事情复杂化...
【问题讨论】:
-
顺便说一句,当您可以使用
BIT时,您是否想要Y和N的枚举,而让您拥有TRUE和FALSE。只是一个想法。 -
answer.id是主键吗?还是每个问题唯一? -
@glowcoder: 只是旧习惯...... MySQL 5.0.5 中为 InnoDB 添加了 BIT 支持,因此 ENUM 更快,所以我仍然继续使用 ENUM,但我会考虑一下,谢谢.. .
-
@the-scrum-meister:
answer.id是它自己的 PK。自动递增的无符号整数,不是每个问题唯一的......我认为让每个问题唯一只会使它变得不必要的复杂......这样更容易维护数据完整性......
标签: mysql performance scalability