La façon dont vous l'avez est la plus optimale en ce qui concerne les contraintes de temps. Bien sûr, cela prend plus de place, mais cela fait partie du compromis espace-temps - Si vous voulez être plus rapide, vous utilisez plus d'espace; si vous souhaitez utiliser moins d'espace, il fonctionnera plus lentement (en moyenne).
Aussi, pensez à l'avenir. En ce moment, vous êtes probablement en train de sélectionner les pays pour chaque utilisateur, mais attendez. Grâce à la magie du fluage de la portée, votre application devra un jour sélectionner tous les utilisateurs d'un pays donné, auquel cas l'analyse du champ "PAYS" de chaque utilisateur pour trouver des correspondances sera incroyablement lente, au lieu de simplement revenir en arrière dans le table USER_COUNTRY_REL comme vous pourriez le faire maintenant.
En général, pour une corrélation 1-à-1 ou 1-à-plusieurs, vous pouvez lier par clé étrangère. Pour une corrélation plusieurs à plusieurs, vous voulez avoir une table de relations entre les deux. Ce scénario est une relation plusieurs-à-plusieurs, car chaque utilisateur a plusieurs pays et chaque pays a plusieurs utilisateurs.