자주 찾는 열을 색인하고, 두 변경을 한 묶음으로 둡니다.
기본 키에는 Postgres가 이미 인덱스를 만든다. where id = 1은 그 인덱스를 탄다. 작성자별 글을 자주 찾으면 author_id에도 인덱스를 둔다.
create index posts_author_id_idx
on posts (author_id);
인덱스는 찾기 빠르게 하고, 넣을 때와 고칠 때는 그 색인도 같이 고친다. 모든 열에 만들지는 않는다. where와 join에 반복되는 열부터 둔다.
이체처럼 두 행이 같이 바뀌어야 하면 트랜잭션으로 묶는다. commit 전에는 다른 세션이 중간 상태를 보지 않는다. 중간에 실패하면 rollback으로 둘 다 없던 일이 된다.
begin;
update accounts
set balance = balance - 100
where id = 1;
update accounts
set balance = balance + 100
where id = 2;
commit;
두 번째 update가 거절되면 commit 대신 rollback을 실행한다. 첫 계좌만 돈이 빠진 채로 남기지 않기 위해서다.
Supabase API의 한 번 호출은 보통 문장 하나다. 두 표를 같이 성공시키려면 데이터베이스 함수나 한 트랜잭션 안에서 실행하는 SQL이 필요하다. 화면의 로그인 키로는 그 경계를 넘지 않는다.