create table account ( id uuid primary key, username varchar(30) not null, inbox text not null, outbox text, local boolean not null, ap_id text not null unique, private_key text, avatar_url text, description text, user_type text not null check ( user_type IN ('PERSON', 'APPLICATION', 'GROUP', 'ORGANIZATION', 'SERVICE') ), created_at timestamptz not null default now(), updated_at timestamptz not null default now(), public_key text not null ); create table following ( id uuid primary key, follower text references account(ap_id) on delete cascade, followee text references account(ap_id) on delete cascade, created_at timestamptz not null default now(), constraint unique_following unique (follower, followee) ); create index "following_pagination" on "following" ("created_at" asc); create unique index unique_username_local on account (username) where local = true; create or replace function set_updated_at() returns trigger as $$ begin new.updated_at := now(); return new; end; $$ language plpgsql; create trigger trigger_set_updated_at before update on account for each row execute function set_updated_at();