-- Create tables CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(30) NOT NULL, email VARCHAR(255) NOT NULL, password VARCHAR NULL, time_create BIGINT NOT NULL, reset_password_token VARCHAR(150) NULL, time_gen_reset_token BIGINT NOT NULL DEFAULT 0, delete_account_token VARCHAR(150) NULL, time_gen_delete_account_token BIGINT NOT NULL DEFAULT 0, time_activate BIGINT NOT NULL DEFAULT 0, active BOOLEAN NOT NULL DEFAULT TRUE, admin BOOLEAN NOT NULL DEFAULT FALSE ); CREATE TABLE families ( id SERIAL PRIMARY KEY, time_create BIGINT NOT NULL, name VARCHAR(30) NOT NULL, invitation_code VARCHAR(7) NOT NULL ); CREATE TABLE memberships ( user_id integer NOT NULL REFERENCES users, family_id integer NOT NULL REFERENCES families, time_create BIGINT NOT NULL, is_admin BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY(user_id, family_id) ); -- Create views create view families_memberships as select m.user_id , m.family_id, m.is_admin , f."name", f.time_create, f.invitation_code, cm.num as count_members, ca.num as count_admins from memberships m left join families f on f.id = m.family_id -- count members left join ( select family_id , count(*) as num from memberships m group by family_id) cm on cm.family_id = m.family_id -- count admins left join ( select family_id , count(*) as num from memberships m where m.is_admin = true group by family_id) ca on ca.family_id = m.family_id