碰到一个问题:
如果想把看过某一篇新闻的所有的读者, 这些所以读者还看过的其他一些新闻全部或者部分罗列出来,
这种关系用数据库怎么高效表示出来呢
[b]问题补充:[/b]
[i]加一个多对多的中间表..
uid aid
1 1
1 2
1 3
4 1
这样,读者id,读过的新闻id..这样在每次一个读者读一篇新闻的时候要添加纪录到这个多对多表.这样要实现你所说的功能就很简单了.
一个读者所有读过的新闻
where uid=1
一个新闻所有的读者
where aid=2[/i]
这样感觉可行,可是还想把 链接的新闻 比如 30% 看过这篇新闻的人也看过另外一篇新闻,和 1% 看过这篇新闻的人也看过另外一篇新闻 区别开来,也就是想分析出其中的权重, 这上面这种解决方案感觉也行,可是感觉效率会很低, 有其他更好的方法么?
对于你的需求,这种方案其实最精确,因为它纪录到了id对id的程度,你的统计都是精确的.而且这种查询的效率不会低,因为它都是id主键的查询,这种查询的效率最高.
而且你既然是想作为一个推荐的机制出现的功能,那实时要求其实并不高,如果你的量确实非常大,你可以将一次查询缓存起来,你每隔个3,5小时再重新查询一次生成新的推荐文章出来.
或者你从另一个角度出发,你想知道的是看这篇文章的从哪里来,然后到哪里去.设计一个这样的表
curid nextid count
2 3 0
比如从文章2跳到文章3的,计数+1,文章本身阅读次数1000,2跳到3的200,就可以20%的看过这篇文章的看的下一篇文章的统计.这样效率是很高,但是这是不精确的,比如一个读者,读了3,然后退出了网站,进来又读了2,从这样的表设计,你并不知道他读了3又读了2,它不是从2-3这样的路径.所以说如果要求精确可以用第一种,不精确可以用第二种.
个人推荐还是第一种.只要结合一下查询缓存,3,5个小时查询生成一次不会对性能有太大影响.
想提高查询速度,推荐建索引!这个是个好办法
加一个多对多的中间表..
uid aid
1 1
1 2
1 3
4 1
这样,读者id,读过的新闻id..这样在每次一个读者读一篇新闻的时候要添加纪录到这个多对多表.这样要实现你所说的功能就很简单了.
一个读者所有读过的新闻
where uid=1
一个新闻所有的读者
where aid=2
给playfish 分吧