Personally I would go with three; however, I don't know your workflow.
My design in part might be something like
(where: PK = Primary Key, FK = Forgien Key):
- t_employee
-
[pk_employee] autonumber
-
[employee_Lname] shorttext(50)
-
[employee_Fname] shorttext(50)
-
[employee_badge] shorttext(15)
-
[other fields and related FK]
-
t_categories
-
[pk_categories] autonumber
-
[categories_name] numeric(long)
-
t_traininglog
-
[pk_traininglog] autonumber
-
[fk_t_employee] numeric(long) enforced relationship t_employee
-
[fk_t_categories] numeric(long) enforced relationship t_catagories
-
[traininglog_datecompleted] date
In t_traininglog I have not constrained the table to prevent duplicated entries ([employee],[category],[datecompleted]); however, at minimum, I would advise one to create an additional composite index to prevent duplicating the same [employee], [category],[datecompleted] record entry.... or you could create an index that prevents a duplicate of the employee, category if the employee was only required to take the training once in the service time of the employee. Of course, one can add logic to a form (and since Access2013 - table level Macros) to prevent this from happening; however, I believe that the simple composite index is sufficient, elegant, and works even when Macro/VBA is disabled.
>> Why not use these additional indexes as the primary key...
Personal choice.
I very strongly dislike composite Primary (aka Natural) keys in tables as these types of Primary Keys make establishing inter/intra-table relationships fiddly, creating select and update/append queries become needlessly complex, and last (but not least) Macros and VBA just do not handle them as gracefully as the arbitrary surrogate primary key. (also, I am in the group that holds that primary keys shouldn't normally have any "real world" meaning... there are some small exceptions such as the periodic chart of the elements, Fe, will be Iron, and Ca will be calcium :) but then again, I use the atomic number :-) )
>> Of Note: the "autonumber" datatype should NOT be relied upon for anything meaningful such as serial or sequential numbering. Autonumbers have one and only one use, to uniquely identify the record.
We're way off topic here so let's move back,
you will need some code at runtime to loop thru either the t_traininglog and the related tables or a query (either in the VBA or as an Access Object) and set your check boxes... but what happens when you add a new category, then you have to redesign the form.
A Parent/Subform arrangement might be a better choice, and most likely will not need to be redesigned every time you need to add a category.
The attached image is an example of one that is a bit more than you might need as it has a parent form and two subforms with the second subform tied to the first subform. However, once can move to the correct parent, and either select, update or enter a new child. The child record once selected will filter out the grandchildren... etc....
Using this arrangement, no code is needed to create the entries. Simply move the parent form to the correct Employee, the related training shows up in the subform, and you can make your entries there.
In the subform, use a combobox bound to [fk_t_categories] with a record source based on the t_catagories showing just the [categories_name]