2011-07-14 110 views
3

我在教自己的rails,並且想要構建一個類似於tumblr的博客。它會有幾種不同的帖子類型,例如書寫文字,照片文章,音頻文章和視頻文章。博客架構設計

我最初的想法是爲每種類型的帖子設置不同的模型,因爲每種帖子都會有不同的規則。然而,我仍然在學習,不知道我不知道什麼,所以也許有更好的方法去處理事情(可能只有一個模型的帖子,以及一個表格的帖子類型?)。

任何反饋將不勝感激。

+0

下面的答案對我來說聽起來很合理。我想浮在腦海裏的唯一要記住的是,db和模型之間的許多「魔術」與下面的約定(約定優於配置)有關,並且如果你試圖在同一個模型上拍兩個模型表你可能會遇到問題讓事情工作。 – jaydel

+0

我正在考慮製作一個簡單的博客平臺以及如何設計它。我打開了SO,頂部有你的問題! :) – bassneck

回答

4

一個很好的關係數據庫和麪向對象的設計可能會有一個主要的後期模型,它可能與所有類型的帖子共享大多數相同的屬性和行爲。這甚至可以充當你的「文本」類型的帖子。

這也可以簡化與帖子的關係(例如,「用戶有很多帖子」與「用戶有很多文字帖子和/或視頻帖子和/或其他」)。

然後有一種「附件」聯接表,其確定附件的類型(因此可以有每交多個附件):

CREATE TABLE attachments (post_id, media_type, media_id) 

然後對每種類型的具體的表和模型行爲和處理媒體類型。

CREATE TABLE audios (id, transcription, storage); 
CREATE TABLE videos (id, location, format, storage); 

這可能需要某種形式的多態的關係,不過,這可能是一個值得商榷的DB設計......你需要意見,並觸發方便地查詢和維護的完整性......但Rails的處理它相當好。

樁模型將有

has_many :attachments 

和附件必須

belongs_to :post 
belongs_to :media, :polymorphic => true 

與各媒體模式將有

has_one :attachment, :as => :media 

,那麼你可以通過

訪問多媒體
post.attachments[0].media 

可以跳過附件表和合並與職位表中的屬性,如果你只需要每一個崗位類型的媒體

對不起,我繼續編輯,我把更多的事情想着說:)

+0

嗨Janechii,謝謝你的回答,也不用擔心編輯:)我有一些困難,找出你的答案會如何工作......我有一個表的基本共享特徵,如user_id和標題,然後爲每種類型的媒體(音頻,視頻等)分別建立模型,然後在附件表PostMedia中有一個帖子和一個媒體類型? – Solomon

+0

我已經編輯了答案..這有點複雜,但會讓我有很大的靈活性,我想。你可以閱讀更多關於任何rails教程中的多態關係。 – janechii

+0

謝謝janechii,如果我只想要每種職位的一種媒體類型,我會怎麼做呢?從我關於多態關係的研究來看,它們主要針對子屬性(例如多個模型的評論),而不是父屬性(文章有多個媒體)。或者我只是將Post表視爲一個子屬性? – Solomon

2

這裏有幾個可以工作的選項。

首先,你可以只讓與列一個型號爲text_contentvideo_linkphoto_link

那麼在你看來,你可以渲染後的視圖用戶(可能使用部分)具有不同看取決於哪些屬性具有值。

第二個選項是創建一個較小的Post表,其中包含關鍵信息並對其他項使用一系列'has_one'關係。

我看到第二個選項的唯一優點是您的數據庫表會更小,因爲您不必一遍又一遍地表示空單元格。除非你擔心一些巨大的縮放問題,否則我會選擇第一個選項。

+0

感謝您回答Brian!各種職位還有其他一些獨特的方面可能會有所作爲。例如,文本文章可能包含大量文字,而照片文章的標題大小有限。你能否詳述一下你的第二個選擇? – Solomon