I'm working on an application for a charitable student organization. The application will track participation and fund-raising for (primarily) student participants in an event. One of the things we'd like to do is collect some demographic information about students who register for the event from our enterprise directory to use in evaluating marketing and to construct reports for the administration on student participation by year, major, college, etc. One of the goals of the project is to market the application to similar organizations at other universities. I'm designing the app with a plugin architecture for authentication and directory access to make it more general.
So far I've come up with a couple of different ways to store demographic information in the database. I can assume that most universities will like to collect (and have sources of information for) similar demographic information. In this case I can keep appropriate parts of the demographic information (those things that change yearly) in columns in the registrations table and the rest in the participants table (those things that are constant for an individual). Alternatively, I've considered keeping a demographics table that holds a registration id, attribute, value triple for each registration and desired attribute. I think that the first option is much easier to query against for reports, whereas the second option is much more flexible.
I'm wondering if there are other alternatives that I haven't considered. Or, if you've faced a similar problem how did you handle it (and how satisfied were you with the result)?