I’m using Rails and MySQL, and have an efficiency question based on row counting.
I have a Project model that has_many :donations.
I want to count the number of unique donors for a project.
Is having a field in the projects table called num_donors, and incrementing it when a new donor is created a good idea?
Or is something like @num_donors = Donor.count(:select => 'DISTINCT user_id') going to be similar or the same in terms of efficiency thanks to database optimization? Will this require me to create indexes for user_id and any other fields I want to count?
Does the same answer hold for summing the total amount donated?
To answer the title question. Yes it is redundant, but whether you should do it depends on your situation.
Unless you have known performance problems, calculate the counts and totals on the fly in your application and don’t store them. That is, don’t store calculated values unless you have no other choice.
In most situations, you wont have to resort to this and shouldn’t.
If you must store calculated values, do the following:
put the code in an update trigger to
keep the count/totals up to date.
databases is that when the numbers
disagree, you are unsure of which is
authoritative. Add to the
documentation a note that the source
data is the authoritative source if
they disagree and can be overwritten.