I’m trying to figure out most of the database design and normalization before I do much for my current project. Unfortunately I don’t have much experience with database design, so it’s a fairly slow process. One of the issues I’m trying to figure out is what’s the best way to deal with a situation where one table may, or may not, be associated with another table.
A little background will help clear the question: I’m building a web application, using Rails 3.2, that helps manage races. People will be able to create accounts (/user accounts), host races, and manage the various aspects.
One thing is that the participants in a given race may or may not be users. In fact, we can assume that most of them will not be users. But for those who are, it would be nice to be able to link to their profiles (and, going the other way, link from their profiles to the races they’ve participated in).
It’s sort of like blog posts where people can post anonymous comments, but if they do decide to log in and use their account then it’s linked with the post in various ways.
I’ve searched for a while, but haven’t really found solutions. I figure the way to do it is to have the Participants model note “has_one UserParticipation”, which would usually be nil.
Is that a valid solution?
Is there a better way to go about this?
Here’s a small diagram I threw together in Paint to concisely show the issue: 
Question 2:
This is a little less important, but I figured I’d ask it in the same question because I’ve already posted the relevant question: several things will reference participants, is there any reason to set up a composite {Race_ID, Participant_Number} super key rather than always reference it using “race.participants”? (As far as I can tell, these would work very similarly.)
You may be over thinking it a bit. If I am following you correctly, this is a simple entity relationship diagram I whipped up in Dia:
Some explanation on the assoications of a User to Participants:
A Participant will have the
belongs_to :userassociation, which isnilif there is no associated User.A User will have the
has_many :participantsassociation, allowing none to many Participants relations. If there are none, a user instance will haveuser.participantsequal an empty array.As to the second question, you would only need to use both keys if you are querying for a specific participant for specific race, e.g.
where participant_id = 7 and race_id = 4.