3P by neo 11일전 | favorite | 댓글 5개
  • 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 인코딩된 값이 들어있는 싱글로우 테이블로 리턴

뭔가 이상한 확장이긴 한데, 확장 가능한 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 열 간의 교차 데이터베이스 조인을 위한 인덱스와 독특한 연산자 구문을 원함