2013-06-21 44 views
1

我将如何存储用户“帖子”?这样我可以有效地从数据库中获取它们,然后在请求特定用户页面时按时间顺序显示它们。Facebook-Timeline系统应该如何查看数据库?

难道我从所有用户的所有帖子存储在一个单一的表像这样:

Post ID | Poster ID | Post Content | Posted to this Users Wall | Post Timestamp 

然后,当用户打开UserFoo的页面我只是得到所有行Posted to this Users Wall = UserFoo

上面的示例不会使表格体积庞大吗?

+0

为Post内容创建一个单独的表格,然后为PostRelationships创建另一个表格。一个用户也是如此(假设你有一个)。发布关系应该像PostID,PosterID,PostPersonsWallID一样。 – raeq

+0

@raeq实际上,实际的表格会有一个关系数据库结构,我试图指出的是,“facebook有十亿用户,所有这些帖子都存储在一张表中?”但当然,其中的一部分存储在不同的表格中,比如帖子的细节是一张表格,目的地是另一张表格,等等,但是“facebook有10亿用户,所有这些帖子都存储在一张表格中?” –

+0

嗨,你是什么意思“发布到此用户墙”属性?它只存储一个“这个用户”?谢谢 – nathan

回答

2

您提出的布局看起来很合理。 5列(四个INT和一个TEXT),根本不是“庞大”的一张桌子。

如果您有适当的索引,查询WHERE "Posted to this Users Wall" = "UserFoo"几乎是即时的。

对于您的目标查询(显示按时间顺序发送到当前用户的墙上的帖子),最佳索引可能在(Posted to this Users Wall, Post Timestamp)(双列索引)上。

2

users

id | name | 

posts

| id | u_id | content | 

wall

| id | u_id | post_id | 

posts U_ID被users.id它的作者

U_ID被users.id它是

,你可以将其命名更明确,即poster_id目标(上墙张贴),target_id


另一种方式是有

post

| id | poster_id | 

wall

| id | post_id | target_id | 

content

| post_id | content | 

您还可以添加其他具体的事情,比如如果帖子是在post


function getUsersWallPosts($target_id) { 
    $query = "SELECT c.content FROM content AS c, INNER JOIN wall AS w ON w.post_id = c.post_id WHERE w.target_id = $target_id"; 
    $result = someUserDefinedFunctionForQueryAndFetch($query); 
    return $result 
} 
评论什么的,另一个表,或列
+0

+1虽然提取单独的'posts'实体提供了更大的灵活性,但是我会考虑将帖子内容移动到单独的表格中是一种矫枉过正。 – RandomSeed