GN⁺: Show HN: pglite-fusion - PostgreSQL 테이블에 SQLite 임베딩하기
(github.com/frectonz)- PostgreSQL 테이블에 SQLITE 컬럼 타입으로 SQLite DB자체를 임베딩 하게 해주는 확장
- 이 방식으로 multitenancy를 해결
-
empty_sqlite
로 빈 DB를 생성 :CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
-
query_sqlite
함수로 쿼리 가능,execute_sqlite
로 인서트/업데이트 가능-
SELECT * FROM query_sqlite(database, 'SELECT * FROM todos');
- `UPDATE people SET database = execute_sqlite(database, 'INSERT INTO todos VALUES (''solve multitenancy'')') WHERE name = 'frectonz';
-
-
get_sqlite_text/get_sqlite_integer/get_sqlite_real
함수로 특정 컬럼 읽어오기 :SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
- Rust + Pgrx 프레임워크로 작성됨
- 구현 상세 :
- CBOR (Concise Binary Object Representation) 인코딩된
Vec<u8>
로 DB를 저장 - 쿼리 실행 시 /tmp 폴더에 랜덤파일로 생성. SQLite가 파일을 로딩하여 쿼리 실행하고 결과를 JSON 인코딩된 값이 들어있는 싱글로우 테이블로 리턴
- CBOR (Concise Binary Object Representation) 인코딩된
뭔가 이상한 확장이긴 한데, 확장 가능한 SaaS를 만들면서 사용자가 간단히 DB 기능을 임베딩 해야하거나 할때 정도는 쓸 수 있지 않을까 생각도 들고 하네요.
Hacker News 의견
-
대부분의 관계형 데이터베이스 관리 시스템은 중첩된 레코드를 지원하지 않으며, SQL도 중첩 테이블을 생성하거나 활용할 수 있는 기능이 부족함
- "그런 태도로는 안 됨"이라는 의견이 있음
-
PostgreSQL 데이터베이스 디렉토리를 tar로 묶고 SQLite에 이진 블롭으로 인코딩하는 아이디어 제안
- 실용적이거나 유용하지는 않지만 SQL 데이터베이스를 중첩하는 개념임
-
이 아이디어의 사용 사례에 대한 의문 제기
- 일반적인 제품에서 데이터베이스 스키마를 설계할 때 사용하기 어려움
- 하이브리드 애플리케이션에서 로컬 사용자 데이터를 계정 정보와 직접 백업하는 용도인지 궁금함
-
SQLite의 JSON 열보다 SQLite 열이 더 우수할 것이라는 의견
- JSON 연산자는 별도의 쿼리 언어를 배워야 하고 제한적임
-
/tmp
파일 메커니즘이 해킹처럼 보이며 꼭 필요한지 의문- SQLite 인메모리 데이터베이스를 생성하고 백업 API나 VACUUM INTO를 사용해 이진 블롭 데이터를 로드하는 방법이 가능할 수 있음
-
PostgreSQL을 사용하는 경우, Row Level Security(RLS)을 통해 멀티 테넌시 문제 해결 가능
- 각 테이블에 테넌트 ID 열을 추가하고 하나의 테넌트만 데이터를 볼 수 있는 정책을 설정하는 것이 매우 쉬움
-
1NF(제1정규형) 범죄?
-
연산자가 없다는 점에 대한 불만
- 여러 DATABASE 열 간의 교차 데이터베이스 조인을 위한 인덱스와 독특한 연산자 구문을 원함