Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Table Inheritance vs. Single Table Inheritance in Ruby on Rails

I have been struggling for the past few hours thinking about which route I should go. I have a Notification model. Up until now I have used a notification_type column to manage the types but I think it will be better to create separate classes for the types of notifications as they behave differently.

Right now, there are 3 ways notifications can get sent out: SMS, Twitter, Email

Each notification would have:

id
subject
message
valediction
sent_people_count
deliver_by
geotarget
event_id
list_id
processed_at
deleted_at
created_at
updated_at

Seems like STI is a good candidate right? Of course Twitter/SMS won't have a subject and Twitter won't have a sent_people_count, valediction. I would say in this case they share most of their fields. However what if I add a "reply_to" field for twitter and a boolean for DM?

My point here is that right now STI makes sense but is this a case where I may be kicking myself in the future for not just starting with MTI?

To further complicate things, I want a Newsletter model which is sort of a notification but the difference is that it won't use event_id or deliver_by.

I could see all subclasses of notification using about 2/3 of the notification base class fields. Is STI a no-brainer, or should I use MTI?

like image 216
Tony Avatar asked Oct 28 '09 01:10

Tony


People also ask

Why use single table Inheritance?

Use STI When The Subclasses Have The Same Fields/Columns But Different Behavior. A good indication that STI is right is when the different subclasses have the same fields/columns but different methods. In the accounts example above, we expect all the columns in the database to be used by each subclass.

What is single table inheritance in rails?

Single-table inheritance (STI) is the practice of storing multiple types of values in the same table, where each record includes a field indicating its type, and the table includes a column for every field of all the types it stores.

What is a standard prerequisite for implementing single table inheritance?

To get started with STI from a database perspective, all you need to do is add a field called “type” to the table. Rails takes this type field and applies the name of the sub-classes that inherit from the class for which the table is named as the value for a row of data.


1 Answers

Given the limited info, I'd say stick with STI.

The key question is: Are there places in your app where you want to consider all types of Notifications together? If so, then that's a strong sign that you want to stick with STI.

like image 198
Mike H Avatar answered Oct 20 '22 00:10

Mike H