Kysteratwork
Unfortunately, you are talking to a guy who is fairly big on "Normalization" although I realize that you have to some times consider common sense.
I suspect you are familiar with some of the following theory...
Fundamentals of Relational Database Design
Download document
Read on-line (HTML)
Micro$oft's answer...
283878 - Description of the database normalization basics
304467 - ACC2000 Defining Relationships Between Tables in a Microsoft Access Database
Okay, to answer your "question", you need to plan what information you need to gelam from a table.
Your design will indeed allow you to select a meeting and see who attended. Is this useful to your and colleagues? Is this all you need?
What about selecting a person and see which meeting or meetings they attended? This can be done with your design, but it would be more cumbersome.
Okay, now move on to the presenters, facilatators, etc. Do you need to determine who presented what? It would make sense to have had the meeting facilatator on the Meeting table. But, in my experience with the "big" presentations, you can have several fascilatators. Do you track this info too? If so how?
Using your basic design, consider the following "Roaster" table...
tblRoaster
MeetingID
contactID
RoasterType
Since your meeting table tracks date and location, etc, the primary key would remain MeetingID + ContactID - a person can attend the meeting once. Since your meeting table also includes MeetingType, you can still group the data in an appropriate manner. But by using one meetnig table, it also means that you may have to duplicate data -- Promotion ABC copied each time you have a meeting on such and such. This is why I included a Course and Class table, but in your case your design will work just fine.
Now by adding one field to the Roaster table, what have a done?
Well first, please realize that this is a "joiner" table used to capture many-to-many relationships. I personally like to call this type of table a "profile" table since it offers "colour" to the relationship. In this case, the "colour" is in what capacity did the contact attend the meeting -- guest, fascilatator, co-ordinator, presenter, subject matter expert, etc.
With one field, you can no capture a lot more information, and I suspect much of it useful information. (Who provided the food at such and such function, who was our subject matter expert at such and such meeting, which sale reps attended meetings on the East Coast.
...Moving on
You raise a very valid point about migrating data -- this step is often overlooked, and often people omit the step and have some person enter the data manually.
The "Roaster" table is your transaction table -- this is where most of your data entry will occur. You really do not need to populate it unless you want to capture info from past meetings.
The Contact table and CompanyUniverse will be fairly static where a simple import will work. (And yes, cleaning up date is so much fun -- with this point in mind, this is one reason why we use relational databases)
With your design, your meeting table is also a type of transaction table. You can still import it -- the only catch would be how to link it to a location if your want to "standardize" your locations.
What I do not see is how the CompanyUniverse links to the other tables. Is this tblContact.ContactCompany <-> tblComanyUniverse.CompanyID or Name?? If so, this linkage will be a bit tricky.
How does one migrate the data and maintain, or create the correct relationships / linkages?
One apporach...
After importing the raw data into your three tables, add a field to tblContacts.CompanyID. Then use an SQL company to use the Company field to find a match the corresponding Company in tblCompanyUniverse and use the CompanyID to populate the forign key field in tblContracts. OR use VBA code to loop through each contact and find the proper company info.
Presentation
I frequently include a presentation section in my analysis since the actual information is the deliverable for the database.
Displaying information in a many-to-many table is really not that hard once you have done it. The information is displayed in a subform. The suborm form (or report)is based only on the joiner table -- in this case, tblRoaster.
The foreign key in the subofrm that links to main form is hidden. The foreign key that links to the remaing table is converted to a combo box.
For example, you have frmMeetings. For sbfrmMRoaster (M = meetings), the MeetingID text box is hidden, and ContactsID control is changed to a combo box that uses something like...
SELECT ContactsID, ContactsLN & ", " & ContactsFN FROM tblContacts
The LN & ", " & FN will combine the two fields into one as "Smith, Mary"
You can spiff it up a bit by either using the double click event procedure to open up the Contact form and display the selected contact, or include a command button to do the same.
To display the above with emphasis on seeing what meetings a contact attended (or perhaps persented), reverse the process. frmContact is the main form with sbfrmCRoaster as the subform. ContactID is hidden and the MeetingID text field is changed to a combo box. To display the meeting location, date and type all based on the one field can be "fun". Using the field concatination techique I used will work, but I suspect it may be messy. Another approach would be to include text fields bound to MeetingID. (Yep, they can be combo boxes too, but then the form looks a little funny with three combo boxes) The bound field uses a function call that returns the desired component based on the MeetingID supplied. This may be a slicker approach.
This will work well for the display. For data entry, you still need to use a form and the subform based on tblRoaster would link to the other table.
A long post -- time for me to get back to work.
Hopefully, I have shown how this is do-able, and most of it is not hard at all. The driving force will be what type of information you want to feed back to your handlers.
Richard