In the real world, people can use the same address, and one person can have more than one address. In addition, people can move (not sure if this is important for your model), so the relationship between the person and the address should have date_from / date_through attributes (again, this may not be important in the context of your application, so you can skip this part ), So I would go with something like
Country :
country_id (PK)
name
State :
state_id (PK)
name
country_id (FK)
Address :
address_id (PK)
state_id (FK)
country_id (FK)
town
- other attributes such as address_line_1, unit_number, postal_code, etc.
** Note: for simplicity, I store state_id and country_id here, which in a sense violates normalization. However, you can let people not enter the state, not in all countries.
Member_Address :
member_address_id PK
member_id FK
FID_address
date_from
date_thru
UNIQUE (member_id, address_id, date_from)
In addition, you can add an Address Purpose object and add a link between the address assignment and the participant’s address (for example, if you need to distinguish between home address / work address / mailing address).
Further, you will see that the mailing address, phone and email are all means of communication, so they can all be considered as a subtype of a common entity, for example communication_mechanism ...