2012-01-03 44 views
2

我在一個社交網站上工作,它有一個類似facebook的牆,用戶可以發佈狀態,圖片和內容。爲用戶建造一堵牆並不困難。我有這樣的結構。facebook壁式數據庫結構要求

Wall 
    { 
    Id, 
    ToUserId (BigInt) (Owner of wall) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

這堵牆只是一個用戶,我不能再使用它,比如,我想網站將有其他 對象太像網頁,論壇等,因此,所有的物體都會有牆爲他們。我不想爲每個牆壁創建單獨的表格。

然後我想,我可以有ObjectId而不是ToUserId,我的結構將會是這樣的。

Wall 
    { 
    Id, 
    ObjectId (BigInt)(PageId/UserId/GroupId (one of them)) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

正如我在我的表中使用增量字段,一個頁面可以有一個用戶具有相同的ID。所以這又是一個問題。

接下來,我想,我的對象應該是字符串類型

Wall 
    { 
    Id, 
    ObjectId (string(10))(PageId/UserId/GroupId (one of them)) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

現在對於一個用戶,我會追加「U」的數量,以便對象ID的將是「1U」,「2U」和他們將是「1P」,「2P」和「1G」,「2G」組。

但我還是不服氣,想聽聽專家對此的意見。

更新

謝謝你們,這個問題,我有是,我怎麼能保持一個表的所有類型的牆。

A wall for a User 
A Wall for a Page 
A Wall for a Group 

如果你看看Facebook的,它的一面牆或至少,我要建立它,所以它應該被附加到任何對象(用戶,到一個頁面或一組或任何東西)。

我希望這現在更有意義。

回答

0

我不明白你爲什麼要創建某種「字符串」引用結構。這似乎不是「關係」。

這個怎麼樣。

一個用戶許多帖子

一個用戶具有一個

一個具有一個

一個具有一個用戶

一個許多帖子

一個具有一個用戶

POCO的(因爲我也懶得寫SQL)

public class User 
{ 
    public int UserId { get; set; } 
    public ICollection<Post> Posts { get; set; } // the Posts this user has written. Could be against different Wall's 
    public Wall Wall { get; set; } // the User's wall. 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public User User { get; set; } // the User who wrote the post. 
    public Wall Wall { get; set; } // the Wall this Post belongs to. 
} 

public class Wall 
{ 
    public int WallId { get; set; } 
    public ICollection<Post> Posts { get; set; } // all the posts on this Wall. 
} 

假設:

  • 一個只能針對一個完成。
+0

感謝RPM,我試圖避免字符串這就是爲什麼我這裏問這個問題。 – Parminder 2012-01-04 01:20:42

+0

說,我還有一個對象頁面。現在頁面也有一堵牆。怎麼做。 ?? – Parminder 2012-01-04 02:24:00

+0

我認爲你需要一種區分用戶類型的「UserType」標誌(TINYINT)。 1 =用戶,2 =組,3 =頁面等 – RPM1984 2012-01-04 02:49:07

0

我會去爲每個可能的引用單獨的可空字段。這也允許你使用外鍵,如果你想要的話,你甚至可以檢查限制,所以所有的行必須有一個定義的參考。我絕對不會推薦去找那個字符串ID的想法 - 這樣做會是無效的。

create table [Posts] 
(
    [ID] int not null identity(1, 1), 
    [ID_FromUser] int not null, 
    [ID_ToUser] int null, 
    [ID_ToPage] int null, 
    [ID_ToGroup] int null, 
    [Content] nvarchar(max) not null, 
    -- more stuff 

    constraint [FK_Posts_FromUser] foreign key ([ID_FromUser]) references [Users]([ID]), 
    constraint [FK_Posts_ToUser] foreign key ([ID_ToUser]) references [Users]([ID]), 
    constraint [FK_Posts_ToPage] foreign key ([ID_ToPage]) references [Pages]([ID]), 
    constraint [FK_Posts_ToGroup] foreign key ([ID_ToGroup]) references [Groups]([ID]), 
    constraint [PK_Posts] primary key ([ID]) 
) 
+0

感謝盧卡斯,但採用這種方法,每次兩列都將是空白的。此外,如果你想添加一個對象,你將需要改變數據庫結構。 – Parminder 2012-01-03 23:31:39