题
我认为Facebook上的每个人都表示为Facebook中的节点(图),每个人(节点)之间的关系/友谊表示为涉及节点之间的优势。
鉴于Facebook上有数百万人,该图如何存储?
解决方案
听起来很奇怪,图形和图形数据库通常被实现为 链接列表. 。正如所暗示的 这里, ,即使是最受欢迎的/性能的图形数据库(NEO4J),也秘密地使用类似于双关联列表的东西。
以这种方式代表图形具有许多重要的好处,但也有一些缺点。首先,以这种方式表示图,这意味着您可以在接近恒定的时间内进行基于边缘的插入。其次,这意味着如果我们只想向上或向上列出链接列表,则遍历图形可能会很快发生。
尽管这有时是贾斯汀·比伯效应,但最大的缺点来自于某些东西,其中有大量连接的节点往往非常慢。想象一下,每次有人链接到贾斯汀·比伯(Justin Bieber)时,都必须穿越一百万个半冗余的链接。
我知道Neo4J的很棒的人正在处理第二个问题,但是我不确定他们如何处理或取得了多少成功。
其他提示
在使用Facebook数据(从Facebook用户中收获)之后,我们将其存储为一对值:user_id,friend_user_id。
但是我想您的问题有点深吗?您可以以不同的方式存储它,具体取决于您的研究问题。一个有趣的选择是三合会 - 例如 - http://mypersonality.org/wiki/doku.php?id=list_of_variables_availables#triad
当我使用社交网络数据时,我们在表格中的数据库中填写了“友谊”关系 Friends(friend_a, friend_b, ...)
带有b-tree索引 (friend_a, friend_b)
加上一些分区。
在我们的情况下,这有点不同,因为该图是指指导的,因此不是真正的“友谊”,而是“跟随/追随者”的关系。但是对于友谊,我只会存储两个边缘: (friend_a, friend_b)
和 (friend_b, friend_a)
如果重要的话,我们使用mySQL存储数据,但我想不应该。