0

我的应用程序中有 3 个实体:user, tag, question.

这些实体之间的关系:

  1. user可以选择tag他们感兴趣的
  2. tags 可以附加到questions

这或多或少类似于 or 中对应实体之间的stackoverflow关系quora

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

我怎样才能有效地实现这一点?

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

  1. userA从某个关联表中获取所有感兴趣的标签
  2. 对表进行IN查询question_tag以获取相关question_id的 s
  3. 在表格中查找question_ids并将结果排序questiontime desc

所以这里有两个IN查询,而且由于tag某个用户的 s 数量可能很大(可能是数千),恐怕这个解决方案还不够快。

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

4

2 回答 2

1

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

select question from listofquestions 
    order by whenitwasasked desc limit 5
于 2013-05-17T00:38:09.437 回答
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

我建议使用一些相关数据进行基准测试,以真正判断什么是最快的。

于 2013-05-17T01:03:37.240 回答