Skip to content

데이터베이스 스키마 설계 문서 (Book Village)

Supabase (PostgreSQL) 기반 데이터베이스 상세 설계. 마이그레이션 00001~00014 적용 기준.

테이블 관계도

profiles (주민)

  ├──< rentals (대출 기록) >── books (도서)
  ├──< book_reports (독서록) >── books
  ├──< quiz_attempts (퀴즈 풀이) >── quizzes >── books
  ├──< book_deletions (도서 삭제 내역)
  └──< market_items (중고장터)

shelves (서재/라벨 배치) -- 독립 테이블
library_settings (도서관 설정) -- 독립 테이블
notifications (알림톡 발송 이력) >── rentals

1. profiles (주민 프로필)

컬럼타입제약조건설명
iduuidPK, FK → auth.users(id)Supabase Auth UID
phone_numbervarchar(11)UNIQUE, NOT NULL휴대폰 번호 (하이픈 없이)
namevarchar(20)NOT NULL실명
dong_hovarchar(20)NOT NULL동호수 (예: "101동 202호")
rolevarchar(10)NOT NULL, DEFAULT 'resident''resident' 또는 'admin'
admin_statusvarchar(10)NULL관리자: 'pending' 또는 'approved'
notifications_read_attimestamptzNULL알림 전체 읽기 시점
created_attimestamptzNOT NULL, DEFAULT now()가입일시
updated_attimestamptzNOT NULL, DEFAULT now()수정일시

2. books (도서)

컬럼타입제약조건설명
iduuidPK도서 고유 ID
barcodevarchar(50)UNIQUE, NOT NULLISBN 또는 자체 바코드
titlevarchar(200)NOT NULL도서명
authorvarchar(100)NOT NULL저자
publishervarchar(100)NULL출판사
cover_imagetextNULL표지 이미지 URL
descriptiontextNULL도서 설명
isbnvarchar(30)DEFAULT ''ISBN 번호
translatorsvarchar(200)DEFAULT ''번역자
published_atvarchar(20)DEFAULT ''출판일
priceintegerDEFAULT 0정가
sale_priceintegerDEFAULT 0판매가
categoryvarchar(200)DEFAULT ''카카오 카테고리
kakao_urltextDEFAULT ''카카오 도서 링크
sale_statusvarchar(20)DEFAULT ''판매 상태
location_groupvarchar(50)NOT NULL서가 그룹 (예: "어린이 코너")
location_detailvarchar(50)NOT NULL서가 상세 위치 (예: "A-3")
is_availablebooleanNOT NULL, DEFAULT true대출 가능 여부 (트리거 자동 관리)
is_deletedbooleanNOT NULL, DEFAULT falsesoft delete
rental_daysintegerNULL도서별 대출 기간 (NULL이면 기본값 사용)
created_attimestamptzNOT NULL, DEFAULT now()등록일시
updated_attimestamptzNOT NULL, DEFAULT now()수정일시

3. rentals (대출 기록)

컬럼타입제약조건설명
iduuidPK대출 고유 ID
book_iduuidFK → books(id), NOT NULL도서 ID
user_iduuidFK → profiles(id), NOT NULL대출자 ID
rented_attimestamptzNOT NULL, DEFAULT now()대출일시
due_datedateNOT NULL반납 예정일
returned_attimestamptzNULL반납일시 (NULL = 대출 중)
created_attimestamptzNOT NULL, DEFAULT now()레코드 생성일시

트리거:

  • on_rental_created: INSERT → books.is_available = false
  • on_rental_returned: UPDATE returned_at → books.is_available = true

4. quizzes (독서 퀴즈)

컬럼타입설명
iduuidPK
book_iduuidFK → books(id)
questiontext퀴즈 질문
optionsjsonb선택지 배열 (4개)
answersmallint정답 인덱스 (0~3)
created_attimestamptz생성일시

5. quiz_attempts (퀴즈 풀이 기록)

컬럼타입설명
iduuidPK
quiz_iduuidFK → quizzes(id)
user_iduuidFK → profiles(id)
selected_answersmallint선택한 답
is_correctboolean정답 여부
created_attimestamptz풀이일시

UNIQUE(quiz_id, user_id) -- 1인 1회 제한

6. book_reports (독서록)

컬럼타입설명
iduuidPK
book_iduuidFK → books(id)
user_iduuidFK → profiles(id)
ratingsmallint평점 (1~5)
reviewtext독서록 내용
created_attimestamptz작성일시
updated_attimestamptz수정일시

UNIQUE(book_id, user_id) -- 도서당 1인 1독서록

7. notifications (알림톡 발송 이력)

컬럼타입설명
iduuidPK
rental_iduuidFK → rentals(id)
typevarchar(10)'7day' 또는 '30day'
sent_attimestamptz발송일시
statusvarchar(10)'sent' 또는 'failed'

UNIQUE(rental_id, type) -- 동일 대출건에 같은 타입 1회만

8. shelves (서재/라벨 배치)

컬럼타입설명
iduuidPK
namevarchar(100)서재명/라벨명
position_xinteger그리드 X 위치
position_yinteger그리드 Y 위치
widthinteger그리드 너비
heightinteger그리드 높이
colorvarchar(20)배경 색상
typevarchar(10)'shelf' 또는 'label'
font_sizeinteger0 = 자동, 양수 = 커스텀
font_boldboolean볼드 여부
created_attimestamptz생성일시
updated_attimestamptz수정일시

9. library_settings (도서관 설정)

컬럼타입설명
keyvarchar(50)PK, 설정 키
valuevarchar(200)설정 값
descriptionvarchar(200)설정 설명
updated_attimestamptz수정일시

기본 설정값:

  • max_rentals: '5' (1인당 최대 대출 권수)
  • rental_days: '14' (기본 대출 기간)

10. book_deletions (도서 삭제 내역)

컬럼타입설명
iduuidPK
book_iduuid삭제된 도서 ID
book_titlevarchar(200)삭제 시점 도서명
book_barcodevarchar(50)삭제 시점 바코드
book_authorvarchar(100)삭제 시점 저자
deleted_byuuidFK → profiles(id)
deleted_attimestamptz삭제 일시
reasontext삭제 사유

11. market_items (중고장터)

컬럼타입설명
iduuidPK
user_iduuidFK → profiles(id)
titlevarchar(100)제목
descriptiontext설명
priceinteger가격
imagesjsonb이미지 URL 배열
statusvarchar(10)'on_sale', 'reserved', 'sold'
created_attimestamptz등록일시
updated_attimestamptz수정일시

뷰 (Views)

overdue_rentals (연체 목록)

반납되지 않은 대출 중 due_date < today인 항목. book/user 정보 JOIN, 7일/30일 알림 발송 여부 포함.

book_ratings (도서별 평균 평점)

book_reports를 book_id로 GROUP BY, COUNT와 AVG(rating) 계산.


테이블 요약

테이블설명레코드 예상 규모
profiles주민 프로필수백~수천
books도서 목록수백~수천
rentals대출/반납 기록수천~수만
quizzes독서 퀴즈수백
quiz_attempts퀴즈 풀이 기록수천
book_reports독서록수백~수천
notifications알림톡 발송 이력수백
shelves서재/라벨 그리드 배치수십
library_settings도서관 운영 설정수 개
book_deletions도서 삭제 감사 로그수십~수백
market_items중고장터 게시글수백

스마트 작은도서관 관리 시스템