Model inheritence and relational databases


#1

Okay the problem I am trying to get to grips with is how inheritence and
data storage in a relational database can work…

I can easily have a model inherit from other models and if the
difference between the two models is fairly small STI works well… But
once you start adding more and more functionality (well properties
actually) STI becomes messy and you want to split the single table up in
to multiple table keeping one table per model…

What is the best way to tackle this?

Lets say I have a base model called Animal which is supposed to have the
properties, weight, age and health. I then create two new models called
Bird and Insect. Bird has the property flying and Insect has the
property bugging…

Would I create two tables, with the full set of fields in, or is there a
way in Rails to keep the common fields in one table and the additional
fields in another table? (I guess not)

BirdTBL
id, weight, age, health, flying

InsectTBL
id, weight, age, health, bugging

[For the sake of this example please imagine there are loads of other
animals each that extends the Animals class, so STI would not be
useful…]


#2

Kris wrote:

Okay the problem I am trying to get to grips with is how inheritence and
data storage in a relational database can work…

I can easily have a model inherit from other models and if the
difference between the two models is fairly small STI works well… But
once you start adding more and more functionality (well properties
actually) STI becomes messy and you want to split the single table up in
to multiple table keeping one table per model…

What is the best way to tackle this?

Take a look at Class table inheritance
http://www.martinfowler.com/eaaCatalog/classTableInheritance.html. If
this
concept suits you, you can give class table inheritance plugin a try at
http://rubyforge.org/projects/clti/. Disclaimer: I’m its author.


Sava C.


#3

Sava C. wrote:

Kris wrote:

What is the best way to tackle this?

Take a look at Class table inheritance
http://www.martinfowler.com/eaaCatalog/classTableInheritance.html. If
this
concept suits you, you can give class table inheritance plugin a try at
http://rubyforge.org/projects/clti/. Disclaimer: I’m its author.


Sava C.

Thanks Sava, thats the word I needed, CTI. Ive had a good google and I
have found quite a few discussion and implementations but nothing stable
or that does not remove certain ActiveRecord features…

I guess its either put up or contribute code :slight_smile:


#4

Guest wrote:


Sava C.

Thanks Sava, thats the word I needed, CTI. Ive had a good google and I
have found quite a few discussion and implementations but nothing stable
or that does not remove certain ActiveRecord features…

My implementation hopefully does not remove any ActiveRecord feature. It
has
some unit tests, but test coverage is far from complete - I’d like to
add all
inheritance tests from ActiveRecord. The plugin also has not been
performance
tested.


Sava C.