I’m creating an application (using PHP / Codeigniter / MYSQL) for tracking volunteers at events. I’d like multiple volunteers to be able to sign on to each event. I plan on doing this using a table called signup which looks something like this:
TABLE SIGNUP
============
VolunteerId EventId
----------- -------
12 223
13 223
15 223
12 235
13 235
19 235
Both columns are foreign keys (to the primary keys of the volunteer table and event table respectively).
Is there a better way to do this?
Should I use a compound-key as the primary key?
Honestly, I don’t see a problem with the way you’ve set it up. Tables like this are commonly used to establish one-to-many relationships between different objects. I’m doing something similar in a table that references counties and cities in a given state. (Some cities span multiple counties.)
Database design best practices state that you should declare a primary key for a table. You don’t have to do this; you can technically declare a table without a primary key. However, note that many DB engines will simply create a primary key for you behind the scenes if you don’t specifically declare a key; this, however, may not be ideal for every situation (and generally isn’t). Specifying a primary key of your choice is good for database optimization and organization.
Due to this, I’d say that you might as well use a compound key as your primary key for your many-to-many table instead of creating a separate index column. In this situation, this will satisfy the table requirements (as a db engine will make a primary key for you regardless) and it will prevent multiple occurences of the same pair, which won’t do you any good in a many-to-many reference table.
Short answer: Go with the compound primary key –
primary key(VolunteerID, EventID). You shouldn’t go wrong.