mysql – Does the design of my database meet the real world standard?

I read a lot, I see tutorials a lot, I practice, I create the first database and now I get lost. I do not know if it is a good practice or a good example of database design in the real world as a professional database practice.

I created a database below that I realize that it is difficult in some tables to avoid duplication, for example, in the directions of the tables, if the husband and wife are registered, both have a similar address. Duplication can not be avoided in the visitors of the table (first name or last name), in the agents of the table (reputation), in the lists of the table (bedroom, bathroom, car) as well.

Here is the code,

DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
Proof of use

CREATE TABLE visitors (
Visitors_id INT (12) NOT NULL AUTO_INCREMENT,
first name VARCHAR (15) NOT NULL,
last_name VARCHAR (15) NOT NULL,
mobile_number VARCHAR (20) NOT NULL,
nic VARCHAR (30) NOT NULL,
nic_image VARCHAR (30) NOT NULL,
profile_image VARCHAR (30) NOT NULL,
PRIMARY KEY (visitors_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE POSITIONS (
positions_id VARCHAR (4) NOT NULL,
Visitors_id INT (12) NOT NULL,
position_name VARCHAR (14) NOT NULL,
PRIMARY KEY (position_id),
FOREIGN KEY (visitors_id) REFERENCES visitors (visitors_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE Agents (
agents_id INT (20) NOT NULL,
positions_id VARCHAR (4) NOT NULL,
bio TEXT,
DECIMAL (2.1) NON-NULL,
PRIMARY KEY (agents_id),
FOREIGN KEY (position_id) REFERENCES positions (position_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE clients (
Customers_id INT (20) NOT NULL,
positions_id VARCHAR (4) NOT NULL,
Email VARCHAR (30) NOT NULL,
PRIMARY KEY (clients_id),
FOREIGN KEY (position_id) REFERENCES positions (position_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE companies (
companies_id INT (20) NOT NULL,
Mark VARCHAR (30) NOT NULL,
register_name VARCHAR (30) NOT NULL,
registration_number VARCHAR (30) NOT NULL,
phone_number VARCHAR (26) NOT NULL,
PRIMARY KEY (companies_id),
FOREIGN KEYS (companies_id) REFERENCES agents (agents_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

CREATE ADDRESSES TABLE (
Address_id INT (12) NOT NULL AUTO_INCREMENT,
agents_id INT (20) NOT NULL,
companies_id INT (20) NOT NULL,
Address VARCHAR (15) NOT NULL,
address2 VARCHAR (20) NOT NULL,
PRIMARY KEY (directions_id),
FOREIGN KEY (agents_id) REFERENCES agents (agents_id),
FOREIGN KEY (companies_id) REFERENCES companies (companies_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Create lists of tables (
Listings_id VARCHAR (12) NOT NULL,
agents_id INT (20) NOT NULL,
title TEXT NOT NULL,
description NOT NULL TEXT,
Location CHAR (20) NOT NULL,
room INT (4) NOT NULL,
bathroom INT (4) not null,
garage INT (4) NOT NULL,
image1 VARCHAR (30),
image2 VARCHAR (30),
image3 VARCHAR (30),
image4 VARCHAR (30),
PRIMARY KEY (Listings_id),
FOREIGN KEY (agents_id) REFERENCES agents (agents_id)
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

SELECT * FROM the agents JOIN the companies ON agents.agents_id = companies.companies_id

The relationship I expected is explained below.

visitors <-> ONE TO MANY positions

A visitor can only have one position and one position can have many visitors.

positions <-> Customers ONE TO MANY

A position can have many clients and a client can have only one position.

positions <-> agents one to many

A position can have many agents and an agent can have only one position

agents <-> UNO A UNO company

An agent can be registered in a single company and a company can have many agents, but only ONE agent. For example, if an agent whose identification is 123 (UNIQUE) is already registered as a member of company Y, the agent can not register as a member of company Z. This is to make sure that another company registers this agent, the base of data will reject it.

agents <-> address ONE TO MANY

An agent can have many addresses, one address only belongs to one agent

agents <-> Listed ONE TO MANY

An agent can have many listings and one only belongs to an agent

My questions:

  1. Is database design good practice?
  2. What kind of standardization can be satisfied?
  3. Do you find a relationship weakness when I explain this query problem?
  4. How can I improve this design to meet the real-world database standard (if any)?

If you have any questions, please ask in simple language that is easy to understand.