Better practice is to expose the functionality of those classes through defines or parameterized classes.
For instance, use a define like apache::vhost in the puppetlabs/apache module:
https://github.com/puppetlabs/puppetlabs-apache/blob/master/manifests/vhost.ppThat way, all you have to do is use the define (no need to include or require the apache class at all), and all the relationships are handled internally in the apache module.
Similarly, a define that allows you to create a database instead of a class that just installs mysql.
This has the benefit of being reusable easily for different purposes and it also keeps you from having to have internal knowledge of the apache and mysql modules to make use of them. Otherwise, you still have to know *how* things are done in the apache and mysql modules, when really you just want a website or a database.