对于Facebook应用程序,我必须在MySQL数据库中存储用户的朋友列表.向我的数据库请求此列表,并与其他数据进行比较等.
目前,我将此朋友列表存储在我的用户表中,朋友的uid放在一个“文本”字段中,并带有一个“ |”作为分隔符.例如:
ID – UID – NAME – FRIENDS => 1 – 123456789 – John Doe – 987654321|123456|765432
我的PHP文件请求此行,并通过展开该字段(‘|’)提取朋友列表.一切正常,每1000个用户大约有5MB磁盘空间.
现在的问题是:
为了增加功能,我还需要保存用户朋友的姓名.我可以用不同的方式做到这一点:
1)将此数据保存在额外的表中.例如:
ID – UID – NAME => 1 – 1234321 – Jane Doe
如果需要ID为1234321的朋友的姓名,我可以从此表中请求姓名.但是,问题在于该表将继续增长,直到对Facebook上的所有用户建立索引(> 5亿行)为止.我的虚拟主机不会这样!这样的表将占用大约25GB的磁盘空间.
2)另一个解决方案是通过在好友字段的UID中添加名称来扩展用户表中保存的数据(使用额外的分隔符,让我们使用“,”).例如:
ID – UID – NAME – FRIENDS => 1 – 123456789 – John Doe – 987654321,Mike Jones|123456,Tom Bright|765432,Rick Smith
对于此解决方案,我必须更改脚本,添加另一个额外的爆炸(‘,’)等.我不确定这将占用多少额外的磁盘空间…但是数据不容易处理这条路!
3)第三种解决方案可以很好地概述所有数据,但会导致数据库庞大.在此解决方案中,我们创建了一个朋友表,每个友谊都有一行.例如:
ID – UID – FRIENDUID => 1 – 123456789 – 54321
ID – UID – FRIENDUID => 3 – 123456789 – 65432
ID – UID – FRIENDUID => 2 – 987654321 – 54321
ID – UID – FRIENDUID => 4 – 987654321 – 65432
正如您在本例中看到的那样,它很好地概述了所有友谊.但是,大约有5亿用户,也就是说,平均每位用户300个友谊,这将创建一个包含1500亿行的表.我的主机肯定不会喜欢…而且我认为这种表将占用大量磁盘空间…
那么…如何解决这个问题?您认为,在Facebook上存储用户朋友的UID名称的最佳方法是什么?如何缩放此类数据?或者,除了上述三种可能性之外,您还有其他(更好)的解决方案吗?
希望你能帮我!
解决方法:
我同意Amber的观点,解决方案1将是存储此数据的最有效方法.如果您要坚持当前的方法(类似于解决方案2),则可能需要考虑将友谊数据存储为JSON字符串.它不会产生最短的字符串,但是很容易解析.
要保存数据:
$friends = array(
'uid1' => 'John Smith',
'uid2' => 'Jane Doe'
);
$str = json_encode($friends);
// save $str to the database in the "friends" column
取回数据:
// get $str from the database
$friends = json_decode($str, TRUE);
var_dump($friends);