Indeed, separation is good practice.
But some info can be grouped into categories, because they belong to the same type of information.
Here is a more accurate suggestion / example:
- user table (ID, email, phone, DOB…) = all general info that pertains to all users, both Agent and Client.
- userType table (userType_ID, user_ID, Agent, Client, Admin, Affiliate,…) = pertains to profile definition of all users.
- agentListing table (agentListing_ID, user_ID* or userType_ID*, house or apt, location, size,…) = pertains to description of all house listings.
- clientLikes table (clientLikes_ID, user_ID* or userType_ID*, agentListing_ID*) = pertains to all houses that have been liked by client.
- clientRequest table (clientRequest_ID, user_ID* or userType_ID*, agentListing_ID*, clientQuestion [text], requestDate,…) = pertains to all listings that are the subject of a client’s request.
This is just an example of how you could organize the information in your DB. The info is separated by family of category.
(note: the asterix are foreign keys - what you call reference keys. They link the data to the same data in the original table and prevent wrong input / data mismatch).