2011-07-14 11 views
3

私は自分自身に教えている、tumblrに似たブログを作りたい。書いたテキスト、写真の投稿、音声の投稿、ビデオの投稿など、いくつかの異なる投稿の種類があります。ブログアーキテクチャの設計

ポストの種類ごとに異なるルールが存在するため、当初考えていたのは、投稿の種類ごとに異なるモデルを使用することでした。しかし、私はまだ学んでいて、私が知らないものを知らないので、物事について行く良い方法があるかもしれません(ポストのための1つのモデルと、ポストタイプのためのテーブルかもしれません)。

フィードバックは高く評価されます。

+0

以下の両方の回答は私にとって妥当なものです。私が心に留めておきたいのは、dbとモデルの間にある "魔法"の多くは、次のような規則(設定よりも慣例)と同じで、2つのモデルを同じものあなたはおそらく問題を起こして物事を働かせるでしょう。 – jaydel

+0

私は座っていて、簡単なブログのプラットフォームとその設計方法について考えていました。私はSOを開いて、トップにあなたの質問があります! :) – bassneck

答えて

4

おそらく、良いリレーショナルデータベースとオブジェクト指向の設計は、おそらくすべてのタイプの投稿で同じ属性と振る舞いを共有する1つのメインポストモデルを持つことになります。これはあなたの "テキスト"タイプの投稿としても機能します。

これはまた、投稿との関係も簡素化することができます(「ユーザーには多くの投稿があります」vs「ユーザーにはテキスト投稿やビデオ投稿などが多数あります」など)。

はその後、添付ファイルの種類を決定する「添付ファイル」の表を結合する、(あなたがポストごとに複数の添付ファイルを持つことができます)の並べ替えています:次に

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 

を持っているでしょう、あなたは

経由でメディアにアクセスすることができなければなりません あなたが唯一のポストごとに1つのタイプのメディアが必要な場合は

あなたは

申し訳ありませんが、私は:)

を言うことをするより多くの事を考えておく、編集を続けるの記事テーブルと属性を添付ファイルテーブルをスキップしてマージすることができます
+0

こんにちはJanechii、お返事ありがとうございました。編集に関する心配はありません:)あなたの答えの仕組みを正確に把握するのが難しいです... user_idなどの基本的な共通特性を持つ投稿用に1つのテーブルを用意しますか? (オーディオ、ビデオなど...)のそれぞれのタイプの個々のモデルを持っている、それは1つのポストと1つのメディアタイプを持つだろう接続テーブルPostMediaを持っていますか? – Solomon

+0

私は答えを編集しました。それは少し複雑ですが、多くの柔軟性を可能にします。任意のレールチュートリアルで、多態性の関係についてさらに読むことができます。 – janechii

+0

janechiiありがとうございました。投稿ごとに1種類のメディアしか必要ない場合は、どうすればいいですか?多相関係に関する私の研究から、親属性(ポストには複数のメディアがあります)ではなく、子属性(複数のモデルに対するコメントなど)が主にあります。または、私はポストテーブルを子属性のように扱いますか? – Solomon

2

ここにいくつかのオプションがあります。

まず、あなただけのtext_contentの列で一つのモデルを作ることができ、video_linkphoto_linkなど

次に、あなたのビューで、あなたは異なると(おそらく部分を使用して)ユーザへの投稿のビューをレンダリングすることができどの属性に値があるかによって見てください。

もう1つの選択肢は、キー情報を持っていた小さいテーブルPostを作成し、他のアイテムとの一連の 'has_one'関係を使用することです。

私が第2の選択肢に見る唯一の利点は、ヌルセルを繰り返し表示する必要がないため、DBテーブルが小さくなることです。あなたがいくつかの巨大なスケーリングの問題を心配していない限り、私は第一の選択肢に行くだろう。

+0

ブライアンにお返事ありがとうございます!違いを生むかもしれないさまざまな投稿には、他にもいくつかのユニークな側面があります。たとえば、テキストポストは大量のテキストを持ち、フォトポストは限られたサイズのキャプションを持つことができます。あなたの2番目の選択肢についてもっと詳しく説明できますか? – Solomon

関連する問題