2012-01-10 62 views
-1

这是关于一个社交网站。让Facebook成为我们的典范。改善Facebook风格墙壁页面的数据库性能

在mysql服务器中有一个表:'posts'保留所有帖子的前缀(不包括评论为简单起见)。其列是:

id,post,user_id,frnd_id_1,frnd_id_2。

id:主键,自动递增。

职位:职位写在墙上(无论是登录用户或任何他/她的朋友们的一个壁)

的user_id:的ID登录的用户(假设A)

friend_id_1:登录用户的朋友(假设B)。当A写在B的墙上时使用这个字段。的朋友的朋友(假设C)的登录用户

如果存在被记录在MySQL表acccordingly A和B之间的任何消息对应:

friend_id_2。

假设B在C的墙上写东西,然后B的朋友会在他们的个人墙上看到它。假设B有100个朋友。我们可以用这种方式将它记录在上述表格中:frnd_id_2将用于保存C的id的记录;

如果frind_2有'0'记录,则消息通信仅在user_id和frnd_id_1之间,否则将意味着frnd_id_1已写在frnd_id_2的墙上,而frind_id_1是user_id的朋友。

除此之外,我想,一切都与FACEBOOK完全相似。

但是 -

假设B有100个朋友。在这种情况下,如果B在C的墙上写道(假设所有隐私设置都为朋友的朋友开放)。如果采取上述政策,表中会有101条记录:

1)一条记录只是表示B在C的墙上张贴了(frnd_id_2 = 0)(我们称之为主记录)

2)另外100个记录为B.(frnd_id_2!= 0)的100个朋友

这是我在我脑中的方式。我可以通过插入'post'列(或保留'post'列空白并创建另一个'main_record_id')而不是完整的消息,而是将主记录的标识插入到主表中。

但事情是:对于单个帖子,101分贝查询(在这种情况下)需要执行。任何其他方式来提高数据库性能?

我使用PHP作为脚本语言。

+0

为什么负号?任何解释plz? – 2012-01-10 11:17:43

+0

首先误解了这个问题。不要担心。 – duffymo 2012-01-10 11:23:04

+0

不能删除-ve等级? – 2012-01-10 11:29:47

回答

0

或者1个数据库查询,将一次网络往返中的所有信息都带回来。我会批处理他们到一个JOIN查询。

如果您打算保留所有这些记录,您不能脱身,但是您可以控制如何访问它们。

另一个要牢记的想法是控制返回结果集的大小。你真的需要所有100个朋友吗?你能一次做十个吗?当您有1,000或10,000条记录要返回时,这将变得尤为重要。

+0

'1数据库查询,将一次网络往返中的所有信息都带回来。我将它们批量加入一个JOIN查询。'请解释,因为我无法理解。什么表加入? '你每次只能做十个' - 什么时候处理剩余的90个记录? – 2012-01-10 11:20:35

+0

Google for SQL JOIN为第一个。我假设用户和朋友或用户和帖子之间存在一对多的关系。如何处理剩余的90条记录?首先,编写你的查询,以便不返回它们。其次,为用户提供“下一个10”链接,以便他们可以获取11-20,21-30等记录。 – duffymo 2012-01-10 11:22:45

+0

我了解SQL连接。对于所有的用户,墙上的帖子都要存储在一张桌子上。那么加入哪些表格?至于90条记录,我不是在一次性显示墙上的所有帖子。相反,当B在C的墙上写字时,对于B有100个发起者,需要将100条记录插入到db中,以便100个朋友在查看墙壁时获得他们的墙壁。 100条记录是关于在墙上页面 – 2012-01-10 11:27:05

0

一个简单的答案:不要使用MYSQL的Facebook类墙 - 这是非常无效的这种目的。

使用no-sql数据库,例如MongoDB。我保证你会惊讶地发现用不同种类的对象进行现场新闻传播更方便。

你也可以结合两个数据库:MongoDB的新闻源和MySQL的一切。