3

我正在爲Facebook這樣的牆結構製作db架構。我需要保存牆貼,分享鏈接,將視頻內容分享到我的數據庫中。直到現在我能夠使這個架構:針對Facebook的DB架構,比如Wall +「共享鏈接」

GO 
CREATE TABLE [Wall] 
    (
     [ID] [int] NOT NULL IDENTITY(1, 1) , 
     [PostText] [nvarchar](MAX) 
     [PostedByUserID] [int] NULL , 
     [PostedOnUserID] [int] NULL , 
     [DateCreated] [datetime] NULL 
    ) 
GO 

接下來我要補充的模式添加了「分享鏈接」和「共享視頻」功能。

GO 
CREATE TABLE [Wall] 
    (
     [ID] [int] NOT NULL IDENTITY(1, 1) , 
     [WallText] [nvarchar](MAX) 
     [PostedByUserID] [int] NULL , 
     [PostedOnUserID] [int] NULL , 
     [DateCreated] [datetime] NULL, 

     [SharedLink] [nvarchar](1024) NULL , 
     [SharedLinkTitle] [nvarchar](512) NULL , 
     [SharedLinkDesc] [nvarchar](512) NULL , 
     [SharedLinkImageSrc] [nvarchar](512) NULL 
    ) 
GO 
與此架構

目前:

第一情況下:當壁柱插入[SharedLink],[SharedLinkTitle],[SharedLinkDesc],[SharedLinkImageSrc]列將被插入作爲無效和其餘的列將具有值。

第二種情況:當插入「鏈接共享」時,「[WallText]」列將插入爲空,其餘列將具有值。

對於我的情況,70%的時間將發佈牆貼和30%的「鏈接」,這意味着70%的案例[SharedLink],[SharedLinkTitle],[SharedLinkDesc],[SharedLinkImageSrc]將插入爲空。現在我擔心的是,它是好保持空列插入或我應該去爲一個單獨的表「共享鏈接」的宗旨,並有分隔的表是這樣的:

GO 
CREATE TABLE [LinkShared] 
    (
     [ID] [int] NOT NULL IDENTITY(1, 1) , 
     [PostedByUserID] [int] NULL , 
     [PostedOnUserID] [int] NULL , 
     [SharedLink] [nvarchar](1024) NULL , 
     [SharedLinkTitle] [nvarchar](512) NULL , 
     [SharedLinkDesc] [nvarchar](512) NULL , 
     [SharedLinkImageSrc] [nvarchar](512) NULL 
    ) 
GO 

我有類似去進一步添加用於共享視頻的模式的方式。請指導我向哪個方向移動?

+0

沒有這張貼在lessthandot上嗎? – DForck42 2010-09-17 16:07:27

回答

5

因爲這些是獨立和不同的項目(牆貼/共享鏈接/共享視頻),每個都有自己獨特的屬性,我建議爲每個項目創建一個單獨的表。

2

使用兩個單獨的表在這裏看起來像一個明智的方法 - 這兩個表似乎沒有什麼共同之處。將不相關的對象組合到一個表中,並將NULL用於不適用的列通常是一個糟糕的設計。

更一般不過,如果你有在某些方面有所不同,但也有一些共同的特點兩種類型的對象,然後另一種選擇,你可以看看是一家有時也被稱爲「表繼承」技術:

在你的第一種方法使用一個包含所有數據的一個表。在第二種方法中,您使用兩個完全分開的表格。繼承方法使用三個表 - 一個用於公共列,另一個用於每個專用類型。然後使用外鍵關係將公共表中的記錄與特定表格中的記錄關聯起來,以便您可以連接以獲取完整的對象。有幾種不同的方式可以創建這種關係,這些關係在上面鏈接的文章中描述。

但不要過度使用表繼承。例如,兩個表可能會共享幾個列(ID,insertion_date),但在其他方面可能是兩個概念上不同的東西。那麼使用這種技術來分解公共列可能不太合適。我不太瞭解您的具體情況,說明在「牆帖」和「分享鏈接」帖子中使用此技術是否合理,但您可能需要考慮這一點。

舉例說明何時可以使用這種技術而不是使用兩個單獨的表格:如果要查詢用戶的最近十個帖子(不管他們是牆帖還是共享鏈接),那麼使用單個表格可以獲得這些帖子的ID,這很有用。如果你有兩個完全獨立的表,而它們之間沒有任何關係,那麼查詢就更加複雜 - 你必須首先從每個表中獲得前10名,合併結果,然後從聯合中獲得前10名。