“By no means should you go with multiple courses as a part of a single whole because you’ll certainly have some other stuff to worry about (like if you need a link to a course, or whatnot).”
By this I mean just that you shouldn’t have a Courses object with, as you say, 300 boxes, each representing a single course.
Regarding the approach to a Course class, you have multiple choices.
First, inheritance: Be sure to tick Allow inheritance on this your Course class. Then, create a smaller Class which will envelop all the particular data on your Course, like topic, etc. This class would extend the Course class, and when you create an instance of it, it will have all the fields native to the Course class, and your “flavour” fields for this particular class. Read more about inheritance here: https://pimcore.com/docs/6.x/Development_Documentation/Objects/Object_Classes/Class_Settings/Inheritance.html
Second, fieldcollections: you could go a different route if you need to create multiple “flavours” on a Course object: Fieldcollections. Read more about them here: https://pimcore.com/docs/6.x/Development_Documentation/Objects/Object_Classes/Data_Types/Fieldcollections.html
Basically, Fieldcollections work like this: Create a collection of Fields you’ll need for a certain instance of a Course. That’s your first “flavour”. Then create a second one, and go on until you reach all the “flavours”. Then, as you create a course, you’ll be able to add those Fieldcollections based on the “flavour”. The pros of this approach are that you can add multiple “flavours”, even some of the same type, to a single Course object. The cons are that it can get unnecessarily complex, fast.
Third, Object bricks: Now these are similar to Fieldcollections, but you can only add one Objectbrick instance at a time. This is a singleton approach. You’re effectively limiting yourself to a single instance of an Objectbrick, but allowing yourself to have a clear division of your “flavours”. Read more about Object bricks here: https://pimcore.com/docs/6.x/Development_Documentation/Objects/Object_Classes/Data_Types/Object_Bricks.html
You can also combine these different approaches into a single model which best fits your needs.
Regarding SQL, I wouldn’t worry too much about it. Pimcore has an extensive PHP API and it will do the heavy lifting for you in that department. You just need to create your Data Model properly.