Solomon
Solomon

Reputation: 7053

Blog architecture design

I'm teaching myself rails, and want to build a blog similar to tumblr. It will have a couple different post types, such as written text, photo posts, audio posts, and video posts.

My initial thought was to have different models for each type of post, since there will be different rules for each type of post. However, I'm still learning and don't know what I don't know, so maybe there is a better way to go about things (maybe only one model for posts, and a table for post types?).

Any feedback would be appreciated.

Upvotes: 3

Views: 523

Answers (2)

janechii
janechii

Reputation: 1203

Probably a good relational database and object oriented design would be to have one main post model, which will probably share mostly same attributes and behaviors with all the types of posts. This could even act as your "text" type posts.

This could also simplify relationships with the posts also (eg. "users has many posts" vs "users has many text posts and/or video posts and/or etc").

Then have a sort of "attachments" join table, which determines the type of attachment (so you can have multiple attachments per post):

CREATE TABLE attachments (post_id, media_type, media_id)

Then have a table and model for each type for specific behaviors and handlers for the media types.

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

This will probably require some sort of polymorphic relationship, though, which could be a debatable DB design... you'll need views and triggers to query easily and maintain integrity... but Rails handles it quite well.

The post model would have

has_many :attachments

and attachments would have

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

and each of the media model would have

has_one :attachment, :as => :media

then you can access your media via

post.attachments[0].media

You can skip the attachments table and merge the attributes with the posts table if you only need one type of media per post

Sorry i keep editing, i keep thinking of more things to to say :)

Upvotes: 4

Brian Glick
Brian Glick

Reputation: 2201

Here's a couple of options that could work.

First, you could just make one Model with columns for text_content, video_link, photo_link, etc.

Then in your view, you could render the post's view to the user (probably using a partial) with a different look depending on which attributes have values.

A second option would be to make a smaller Post table that just had key information and use a series of 'has_one' relationships to the other items.

The only advantage I see to the second option is that your DB table would be smaller since you don't have to represent the null cells over and over. Unless your worried about some huge scaling issues, I'd go with the 1st option though.

Upvotes: 2

Related Questions