2012-11-30 69 views
2

我正在製作一個新聞網站,但我想讓用戶從Facebook插入狀態。用戶可以在寫新聞時將其狀態置於新聞的任何位置。我想在插入新聞時顯示新聞。新聞數據庫設計

這裏的新聞爲例內容

‘有些用戶插入的文本狀態其他一些文字一些其他身份其他文本另一種狀態

所以我在這種情況下思考什麼是一個好的數據庫設計。狀態有用戶,誰寫了它,日期和內容。新聞有標題,描述和日期。

我已經想出了五張桌子。

NewsHeader

id 
NewsTitle 
NewsDesc 
NewsDate 
User 

NewsContent - 只包含ID和的消息

id 
content 

表狀態或文字NewsContentDetails消息 - 包含的細節狀態

id 
ContentUser 
ContentDate 

NewsContentDetailsLink - NewsContentNewsContentDetails

NewsContentId 
NewsContentDetailsId 

表的結合表NewsHeaderContent - 結合表NewsHeader的NewsContent

NewsHeaderId 
NewsContentId 

這是一個好的數據庫設計還是有更好的方法來做到這一點?我擔心在顯示新聞時,我必須在sql查詢中編寫多個JOIN,並且速度會很慢。

編輯: 數據庫設計由@hrr

**News:** 

ID建議|標題|內容|用戶|日期

**Elements:** 

ID |內容|用戶|日期| News_ID

元素某些字段將是空的,我認爲這不是一個很好的選擇。

在此先感謝:)

+2

老實說,我看到的最大的問題是名稱似乎非常通用。我甚至無法理解你如何模擬事物。名稱應該是描述性的,而這些不是。我更喜歡'[NewsArticleHeader]','[NewsArticleContent]'等等,我也喜歡用他們的名字鬆散地組織表格。這裏顯而易見的是'[NewsArticleHeader]'和'[NewsArticleContent]'的名稱。 Terse對象名稱可以在編碼時節省時間打字的時間,但之後會讓閱讀代碼或使用數據庫模式的讀者感到困惑。打字很簡單。理解很難。 –

+0

我編輯了我的問題。我希望現在好一點。 – lam3r4370

+1

什麼會使狀態變得特殊而與整個文本不同?爲什麼不合並,你只需要一個nvarchar(max)字段? –

回答

3

,除非你想使用一個以上的標題相同的內容你不需要NewsHeaderContent,但我不相信你想要的話,那麼你可以用兩個表:

NewsHeader

id 
NewsTitle 
NewsDesc 
NewsDate 

NewsContent

NewsId 
ContentId 
Sequence 
content 
ContentUser 
ContentDate 

可以使用領域Sequence訂購該內容。

在該結構中的一些數據的一個例子:

NewsHeader

id NewsTitle  NewsDesc    NewsDate 
1 'First News' 'Some Description'  2012-10-07 
2 'Another News' 'Description of News' 2102-12-07 

NewsContent

NewsId ContentId Sequence content     ContentUser ContentDate 
    1   1   1 'Some Text'      NULL  NULL 
    2   1   1 'Some user inserted text'   NULL  NULL 
    2   2   2 [Status]       User2 2012-12-07 
    2   3   4 [Some other status]    User2 2012-12-07 
    2   4   3 'Some other text'     NULL  NULL 
    2   5   5 'another text'     NULL  NULL 
    2   6   6 [Another Status]     User2 2012-12-07 

序列將能夠被改變,並作爲ContentUser和ContentDate只有在狀態時纔可以使用,那麼你可以使用這些場景d來識別它的文本或狀態,或者您可以添加一個可以容納例如T的文本和S狀態的字段Type

這裏我舉的例子的SQLFiddle:SQLFiddle

+0

ContentDate的狀態必須是狀態的日期。而ContentUser是狀態的用戶,所以除非我插入狀態的信息,否則這兩個將是空的。 – lam3r4370

+0

如果出現這種情況,您可以允許ContentUser和ContentDate爲空,我將編輯我的anwser以反映這一點,並改進NewsContent以允許更改期貨。 –

+0

我對這些空白的領域有所懷疑,因爲它們會很多。這是否違反規範化規則? – lam3r4370

1

您可以使用一個表的新聞和一個表的元素。

新聞:

ID | Title | Content | User | Date 

元素:

ID | Content | User | Date | News_ID 

每個元素都將擁有自己的消息ID!無需創建額外的「連接」表格。

+0

但是用戶可以在新聞中插入任何他想要的狀態,並且我想在插入消息時顯示它。 – lam3r4370

+0

你可以嘗試進一步解釋嗎?我不確定我明白。 – hrr

+0

下面是一條新聞的內容:「一些用戶插入文本**狀態**一些其他文本**一些其他狀態**另一個文本**另一個狀態**」。所以我無法弄清楚如何在數據庫設計中保存文本序列 – lam3r4370

1

,如果你想讀操作,以極快的(我假設將給予假設它是一個新聞網站),我認爲,可能是下面的設計將保持良好:


總表的設計: enter image description here

  1. 我沒有看到分離新聞內容和新聞標題的理由嗎?所以我假設它是一對一的映射(即使情況並非如此,解決方案也不會改變很多)。所以我只是有一個新聞表

    新聞
    ID |標題| Desc |日期|內容

  2. 接下來,我將有一個UserStatus表

    UserStatus
    ID |用戶ID |狀態文本


當用戶想要創建一個新聞消息,如一個由你[「有些用戶插入的文本狀態的一些其他文本指出了一些其他狀態的另一個文本另一個狀態「],他/她可以簡單地爲句子的每個片段選擇新聞和/或狀態。

用戶創造出一個句子,你可以獲取相關內容的新聞和狀態ANS存儲在直接在表中形成的消息,所以你會被讀優化的消息表:

Message 
id | message | User id | DateTime 

缺點是您可以通過狀態或新聞ID進行過濾,如果新聞或狀態更改,您也不能更新消息。

如果我們假設你允許用戶改變任何消息或狀態,或者您想要過濾的消息ID或狀態ID消息另一種方法是:

商店消息ID和消息ID的映射其中新聞已經被引用以及狀態ID和消息ID的映射,其中狀態被引用以及片段序列號。所以,你會:

News-Message-Mapper 
News Id | Message Id | Fragment Sequence 



Status-Message-Mapper 
Status Id | Message Id | Fragment Sequence 


片段序列指示位置的狀態或消息出現在整個郵件中。

現在,如果更新或刪除新聞或狀態,則只需引用這兩個映射表,然後重新生成這些消息或將其刪除。

這會優化讀取操作,但更新過程很複雜,但您的參照完整性和規範化規則會得到保持。另外,你可以通過新聞ID或狀態ID過濾郵件

+0

好吧,但如果用戶重新排列狀態的位置呢? – lam3r4370

+1

然後,您需要更改新聞消息映射器和狀態消息映射器中的片段序列,或者更好地刪除兩個表中的舊映射,並根據重新排序的消息添加新聞條目。 – Ngm

+0

因此,消息表將包含整個句子,對吧? – lam3r4370