지금까지는 데이터를 받아서 프론트(서버단)에서 수정하는 식으로 작업함.

뷰를 사용하면 그럴 필요가 많이 줄어들 듯. 새로운 데이터 조합이 필요할 때마다 커스텀 타입과 뷰를 적절히 사용하면 필요한 데이터만 편하게 불러올 수 잇을 것 같다.


when to use serial and uuid

1. Functions (함수):

PostgreSQL에서 함수는 SQL 쿼리, PL/pgSQL (Procedural Language/PostgreSQL), PL/Tcl, PL/Perl, PL/Python 등 다양한 언어로 작성될 수 있는 코드 블록입니다. 이 함수들은 특정 작업을 수행하거나 사용자가 정의한 비즈니스 로직을 실행하는 데 사용됩니다.

RPC(원격 프로시저 호출, Remote Procedure Call)는 클라이언트와 서버 간에 프로시저(함수 또는 메소드)를 호출하여 원격 시스템에서 코드를 실행하는 프로세스를 나타냅니다. SQL에서는 주로 저장 프로시저를 사용하여 RPC를 구현합니다.

예시

create or replace function hello_world() 
returns text -- return type. if nothing can be void
language sql --language used inside the function body
as $$ -- function wrapper 
  select 'hello world' -- function body
$$ -- wrapper end

호출

// java script
const { data, error } = await supabase.rpc('hello_world')
// sql
select hello_world();

2. Views (뷰):

뷰는 하나 이상의 테이블이나 다른 뷰의 결과를 기반으로 하는 가상 테이블입니다. 뷰를 사용하면 복잡한 쿼리를 단순화하고 데이터를 논리적으로 구성할 수 있습니다.

create schema temp
set search_path to temp

-- create sample
create table temp.writers (
  id uuid default generate_uuid_v4(),
  name text not null
)

alter table temp.writers
add primary key (id)

create table temp.notes (
  id serial not null primary key,
  title text not null,
  description text not null,
  writer_id uuid not null references temp.writers(id) on delete cascade
)

alter table temp.notes
add column views integer default 0

-- insert
insert into temp.writers (name) 
values ('james'), ('ron'), ('judy');

insert into temp.notes (title, description, writer_id) 
values ('it rains outside', 'so i took raincoat', (
  select id from temp.writers where name = 'judy' limit 1
));

-- create view 
create view temp.note_info as
select temp.notes.id, temp.notes.title, temp.writers.name
from temp.notes
join temp.writers on temp.writers.id = temp.notes.writer_id

3. Triggers (트리거):