(Your original post did not address performance but normalization, but it has has many edits and "performance" was introduced, maybe because your comments have mentioned it.)
One of the points of the relational model is generic querying with automated implementation with automated optimization. Ignore performance initially. Just make a straightforward design. (Before which you must learn how to make one.) Ids have nothing to do with performance. Normalization has something to do with performance but since you should normalize to 5NF first that is moot. Foreign keys have something to do with performance but since you should be defining them for integrity their role in performance is moot. Proper designs enable later tuning.
Anyway performance is a tradeoff of factors and if you do not know what sorts of things you want to do it is meaningless to discuss performance. (Or if you do not even know what those sorts of things are.) Also, performance-related properties must be measured to even hold an opinion that manual optimization intervention is appropriate. (And again you would have to understand what those factors even are.)
When performance becomes a demonstrated issue because a particular application makes particular patterns of queries or updates then you can address performance. First via indexing and views to make those patterns perform better--always at the expense of others.
The sorts of things you are mentioning (and not mentioning) and the way you are mentioning them suggest that you have misconceptions about performance and its relation to design. Also that your understanding of relational structure, querying and DBMSs is extremely low. Until you learn much more about basic design any advice you get about biasing for performance is misdirected. So just forget about performance. The main thing that adversely affects performance is premature concern for performance getting in the way of a straightforward design.
A simplest design is
person(id, name, profession, city, country)
-- person [id] is named [name] and practises [profession] in [city], [country]
city (name, country) -- [name] uniquely names a city within country [country]
country (name) -- [name] uniquely names a country
This has certain keys and FKs, just declare them--which has nothing to do with performance. It is in 5NF.
You may come to understand that the following design (you can add relevant constraints) may be better for you than the previous one--which will have nothing to do with performance. Then you can move to it and offer the previous tables as views to old users--which will have nothing to do with performance.
person(id, name, profession, id_city)
-- person [id] is named [name] and practises [profession] in [id_city]
city (id, name, id_country) -- city [id] is named [name] and is in country [id_country]
country (id, name) -- country [id] is named [name]
Here id_country in person would violate 5NF since it would be functionally dependent on a non-key, id_city.
select
. and if you want give all the cases for Inserts, Deletes and updates. – ForepawBrazil
what will be the best approach ? – Forepaw