DROP TABLE IF EXISTS address_types CASCADE;
CREATE TABLE address_types (
    address_type_id SERIAL PRIMARY KEY,
    address_type VARCHAR(20) NOT NULL
);

DROP TABLE IF EXISTS cities CASCADE;
CREATE TABLE cities (
    city_id SERIAL PRIMARY KEY,
    city_name VARCHAR(255) NOT NULL,
    city_state VARCHAR(255) NOT NULL
);

DROP TABLE IF EXISTS addresses CASCADE;
CREATE TABLE addresses (
    address_id SERIAL PRIMARY KEY,
    address_type_id INTEGER REFERENCES address_types ( address_type_id ),
    street VARCHAR(255) NOT NULL,
    city_id INTEGER REFERENCES cities ( city_id )
);

DROP TABLE IF EXISTS districts CASCADE;
CREATE TABLE districts (
    district_id SERIAL PRIMARY KEY,
    district_code VARCHAR(255) NOT NULL
);

DROP TABLE IF EXISTS address_districts CASCADE;
CREATE TABLE address_districts (
    address_id INTEGER REFERENCES addresses ( address_id ),
    district_id INTEGER REFERENCES districts ( district_id )
);