我正在为vk.com开发约会应用程序(它是俄罗斯的facebook),因此我需要保留社交图(通过共同兴趣,朋友,喜爱的音乐,电影等链接的个人资料)。用户A看起来比用户C最接近用户B,因为他们有2个共同的朋友和5个共同的兴趣VS 1个共同的朋友和4个共同的兴趣","用户C最接近... "等 什么是这个问题的好方法? 我从数学中了解图形理论,但我从未使用计算机科学中的图形(我是网络开发人员),我认为这个问题可以通过为任何用户生成图形并保留它来解决。在NoSQL数据库(如mongo或redis)中,但这是一个糟糕的解决方案(没有实时更改,生成将需要很长时间)。 你怎么看待这个问题?
答案 0 :(得分:2)
有比基于键值的数据库更专业的NoSQL解决方案。看一下像neo4j这样的图形数据库。图形数据库可以让您以直观的方式轻松存储和操作图形。许多基于图形的算法运行速度非常快(与sql相比)。
您还应该看看大型社交网络是如何做到的,特别是如果您有兴趣分析整个图表(对于数据挖掘,这超出了单个用户的实时计算)。据我所知,facebook使用大量缓存的MySQL数据库进行Web请求,使用Hadoop / HBase和Hive进行繁重的数据计算。除了他们的消息传递平台,facebook的大多数实时部分都不需要NoSQL。
答案 1 :(得分:2)
您可以考虑的一个选项是Twitter FlockDB(已经提到过Neo4j)。如果您的问题空间是大规模的简单查询,那么这可能是合适的。它不支持像Neo那样的图形行走查询,但是它被Twitter用来存储他们的社交图并支持诸如“谁做跟随”等查询。
答案 2 :(得分:1)
老实说,我不认为Facebook将他们的主要数据存储在图形数据库中。我认为他们存储了朋友列表和兴趣列表等。查看他们的文档至少会告诉你它是如何组织的。如果“我喜欢电影”的信息与我的帐户和兴趣“电影”相关联,那么很容易查找我喜欢的内容以及谁也喜欢电影。
计算总体“亲密度”....如果你只需要有至少一个共同朋友的人,那么直接评估所有这些人的亲密度可能足够快。否则,我会考虑查看更高维的近似k-d树搜索,在您的搜索空间中将intests设置为维度。