如何查询"最新问题"有效?

时间:2013-05-17 00:33:08

标签: mysql database-design innodb

我的应用中有3个实体:usertagquestion

这些实体之间的关系:

  1. user可以选择他们感兴趣的tag
  2. tag可以附加到question s
  3. 这或多或少类似于stackoverflowquora中相应实体之间的关系。

    现在我正在尝试添加一个名为“最新问题”的页面,其中我将使用访问用户感兴趣的标签呈现一些最新问题。

    如何有效实施?

    假设访问用户为userA。 我现在能想到的解决方案是:

    1. 从某些关联表
    2. 中获取所有感兴趣的标记userA
    3. 针对IN表执行question_tag查询以获取相关question_id s
    4. question_id表中查找question并按time desc
    5. 排序结果

      所以这里有两个IN个查询,因为某个用户的tag个数可能非常大(可能是几千个),我担心这个解决方案不够快

      我正在考虑编码多个标签并将结果放在question表的一列中,有什么好方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要在该列表中添加一个时间戳字段,然后只需按时间戳获取带有限制的列表排序。假设SQL:

select question from listofquestions 
    order by whenitwasasked desc limit 5

答案 1 :(得分:0)

解决方案#1
在mikebabcock的答案的扩展中,您可以使用TEXT字段实现标记,该字段具有.个标记名称。例如,.php.object-oriented.。然后,在构建数据库查询时,请使用类似于:

的内容
select `question` from `questions_tbl` 
  /* list of tags... */
    where `tags` like '%.php.%'
    or `tags` like '%.object-oriented.%'
  /* sort results */
    order by `ask_time` desc limit 5

这有多高效将取决于您正在使用的数据库引擎。这很可能与原始解决方案一样慢(或慢)。

解决方案#2
有两个表来索引您的标签。一个将用户映射到标签,另一个将标签映射到问题。然后,执行一些连接语句以过滤掉相关问题。例如:

select q.* from
  /* inner join user index and question index */
    `usr_tags` ut inner join `ques_tags` qt on ut.tagID = qt.tagID
  /* inner join index to questions */
    inner join `questions_tbl` q on q.id = qt.quesID
  /* filter conditions */
    where ut.usrID = 'users_id'
    order by q.askTime desc limit 5

我建议使用一些相关数据进行基准测试,以确定最快速度。