In my opinion, the answer may depend on whether the number of commands is fixed and rather small. Of course, whether command names are fixed or not may also matter, but this is probably more related to column names.
In particular, my opinion is this:
If the business requirement is to always have a small and fixed number of people (for example, three) on a call, then it might be more convenient to select three columns in the Schedule , one for each team to store the identifier of the assigned person, i.e. e. how is your current structure:
dt OnCall_NY OnCall_MA OnCall_CA --- --------- --------- ---------
with dt as the primary key.
If the number of commands (in the Team table) is also corrected, you can include the command names / pointers in the column names, as you are doing now, but if the number of commands is more than three, and this is just the number of commands in Schedule , which is limited to three, then you can simply use names like OnCallID1 , OnCallID2 , OnCallID3 .
But even if this requirement is corrected, it may turn out to be fixed today, and tomorrow your boss says: โWe no longer work with a fixed number of teams (on call),โ or โWe need to increase the number of groups supported to four, and we it may be necessary to extend them further in the future. " So a more universal approach would be the one you plan to switch in your question, i.e.
dt Team Person --- ---- ------
where the primary key will now be dt, Team .
Thus, you can easily expand / reduce the number of people on a call at the database level without having to change anything in the circuit.
UPDATE
I forgot to refer to your third option in my original answer (sorry). Here it goes.
Your first option (the one that is actually implemented at the moment), apparently, implies that each team can be represented (no more) by one person. If you assign surrogate identifiers for Person / Team pairs and use these keys in Schedule instead of separate identifiers for Person and Team , you probably will not be able to enforce the specified โone person per team on scheduleโ (or at least this it may seem somewhat difficult) at the database level, while using separate keys it would be enough to install Team as an integral part of the composite key (dt, Team) , and you will end up with no more than one team per day.
In addition, you may have difficulties with the person changing the team over time if their presence in the team was fixed in this way, that is, with the Schedule link to the Person / Team pair. You may have to change the Team link in the PersonTeam table, which will distort historical information: when viewing people who will be chimes on a certain day, the character shown by the Group will be who they belong to now, and not the one they made then.
Using separate identifiers for people and teams in Schedule , on the other hand, will allow you to freely change commands if you do not (Schedule.Team, Schedule.Person) link to (PersonTeam.Team, PersonTeam.Person) , of course.