IMO There really is no best practice.
Each report request offers unique requirements that may require a different approach.
I recommend you read up joins (links). You can use SQL joins to research instead of Crystal as they are move prevelantly written about and are basically the same thing (a caveat is enforcing a join).
Getting the "correct" join on the "correct" field is critical to getting the correct data set to report on. Joining the same two tables for two different reports can be drastically different based on each report requirement.
Once you understand joins you can more readily plan the report before you even start building it because you can more easily get the best data set for this specific report.
You also have to understand how your select statement (or SQL WHERE clause) can impact a join.