• I wouldn't say its a requirement or a best practise

    The answer is 'it depends' - on the data.

    A Foreign key is used to enforce referential integrity - so you can't add child rows unless the parent key exists. If this makes sense for your data then go ahead, use a foreign key - but there may be circumstances where it doesn't make sense - and the foreign key will simply prevent you from modelling your data correctly.

    But it is nearly always a good idea to index your join columns.