I think some examples can ease understanding.
When we should use relations
We have data A and data B, B relates to A. This relation could be caused by Drupal (like author of a node), or be caused by a reference module (like taxonomy, node reference, user reference, etc).
Imagine that A is the content piece and B is the author. We are designing a view of nodes (type A) , and we want to restrict nodes to ones which are written by a user (type B) whose score is more than 100 (imagine this field is added to user fields).
I need data of user. To get these data we use a relation. We make a relationship based on author's uid, which brings information about a user with it.
So we use relationships to access data of B using its relationship to A.
What is a contextual filter
Imagine I want a block that lists all nodes written by a user. I want it to be displayed on each user's account page.
I have to filter nodes by something which is contained in the page which the block is shown on. In this situation I use a contextual filter.
I get data from the page (address, title, body, etc) where the block should be displayed; here there is not a straight relation. The view's content must be filtered by the user's id, but we are not getting the uid from a user. Rather, we are getting this info out of the page the view will be rendered on.
So contextual filters are usually used when we want to filter a view based on a place it will be displayed.