日期:2014-05-18  浏览次数:20493 次

dearbook或douban中 “购买过本书的人也购买过。。。”的实现
比如有book表 User表
再弄个表UserBooks表,存放ID,UserId,BookId
用户购买了一本书后就会在UserBooks中生成一条记录。
有了一定的数据后,我们便可以在某本书的购买页面通过该书的BookId查询UserBooks表,从中得到购买了该书的用户,然后用通过这些用户ID即UserId,查询出这些User分别购买了那些书,最后统计各本书被购买数量的Top 10。这样就得出了推荐数据。

1)请问是这样做吗?
2)还有要是购买了本书的有20万人,每人又都购买过100本书,那么这样的查询太费劲了吧?
关于第二个问题,我想,可以这样:
为每本书生成一个与其他书的关联XML文件,存放有关联的书ID及被关联的次数。当用户购买一本书后,系统就读书用户还购买过哪写书,然后分别在这些书的XML文件中添加一条用户刚购买的那本书的数据,如果已经存在这个数据那么就将关联次数+1。最后我们在浏览图书购买界面的时候,只要读取该书的XML文件,即可获取与之关联的书籍。这样如何?

期待大家的解惑...

------解决方案--------------------
不会每次查询的,肯定是预计算的,大概不会使用XML文件,而是放在数据库里的

用你的UserBooks表(UserId,BookId),可以这么计算书间的关联强度

譬如
书1的购买者
1,3,4,5,6,7
书2的购买者
3,4,7,8,9

这样书1与书2之间有3个共同购买者(3,4,7),其关联系数是 3/(6+5-3) = 3/8 , 这里的8是两本书的不同购买者总数,这种算法叫tanimoto coefficient,还有其他的算法

通过这样的预计算,你可以得到某本书与所有其他书的关联系数,然后你就可以按系数的倒序排列,显示最前面的10本

------解决方案--------------------
思归大哥的贴,留名学习~~