我的应用中有3个实体:user
,tag
,question
。
这些实体之间的关系:
user
可以选择他们感兴趣的tag
tag
可以附加到question
s 这或多或少类似于stackoverflow
或quora
中相应实体之间的关系。
现在我正在尝试添加一个名为“最新问题”的页面,其中我将使用访问用户感兴趣的标签呈现一些最新问题。
如何有效实施?
假设访问用户为userA
。
我现在能想到的解决方案是:
userA
IN
表执行question_tag
查询以获取相关question_id
s question_id
表中查找question
并按time desc
所以这里有两个IN
个查询,因为某个用户的tag
个数可能非常大(可能是几千个),我担心这个解决方案不够快
我正在考虑编码多个标签并将结果放在question
表的一列中,有什么好方法可以做到这一点?
答案 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
我建议使用一些相关数据进行基准测试,以确定最快速度。