Forget this "good practice" business. Learn all that is necessary (this site is great for clearing your doubts), analyze the specific problem and apply the best technique for the case. Good practice is to follow cake recipe blindly, is to look for a unique solution for all cases and this does not work well.
Composite keys exist because they are useful. If there is a natural key that can be suitable and if the natural key is formed by more than one column, you can use it without problem. Just make sure this key is really suitable.
It’s very common for people to think that a natural key is appropriate and actually not to be. It can be great at a given time and then show itself problematic. That’s why it is very common to choose a replacement key, such as the ID
or something like that.
I particularly always analyze by default whether it is possible to use a natural key. Almost always the decision is that it cannot.
In some cases one may think of using a composite substitute key, although some will say that it actually ends up being natural. A key that is a ID
(which functions as a foreign key as well) plus a sequential item number, is a key that can be considered substitute and be composed. This is common in order registers, for example.
The link tables are usually like this, almost always use foreign keys related to two or more tables and together form a composite primary key. Use well suited in most situations. I find it quite rare to need a replacement key for this, but need may occur.
related: http://www.agiledata.org/essays/keys.html, does not answer your question, but can help you understand some factors.
– Tobias Mesquita