SQL #5 소셜미디어 포스트 리뷰 시스템 #
#2025-07-30
1. 문제 #
JSONB 기반의 메타정보 필드 설계 + 검색 + AI 분석 연계
테이블 개요
- Day 2 – jsonb_metadata_sql_practice.sql
- 주제: 소셜미디어 포스트 리뷰
- 목적: 포스트에 대한 사용자 평가 + 해시태그/속성을 JSONB로 저장하여 AI 추천/필터 기반 만들기
실습 준비
- 특정 메타 속성 포함 검색(JSONB 검색 쿼리 실습)
- GIN 인덱스 생성
- AI 필터링 활용 시나리오 (Hybrid Filtering 기반)
문제
- sentiment가 negative인 리뷰만 출력
- 메타데이터에 “language” 키가 포함된 행 찾기 (? 연산자 사용)
- “topic"이 “productivity"이 아닌 리뷰만 출력 (힌트: NOT (metadata @> …))
#
2. 소셜미디어 포스트 리뷰 테이블 생성 #
CREATE TABLE post_reviews (
review_id SERIAL PRIMARY KEY,
post_id TEXT,
review_text TEXT,
metadata JSONB
);
INSERT INTO post_reviews (post_id, review_text, metadata) VALUES
('POST001', '이 포스트는 인사이트가 풍부했어요!', '{"topic": "AI", "sentiment": "positive", "language": "ko"}'),
('POST002', '내용이 다소 어렵고 추상적입니다.', '{"topic": "philosophy", "sentiment": "negative", "language": "en"}'),
('POST003', '짧고 명확해서 유익했어요!', '{"topic": "productivity", "sentiment": "positive", "language": "ko"}'),
('POST004', '그저 그런 느낌이었어요.', '{"topic": "lifestyle", "sentiment": "neutral", "language": "en"}');
CREATE INDEX idx_post_reviews_metadata ON post_reviews USING GIN (metadata);
#
3. sentiment가 negative인 리뷰만 출력 #
SELECT *
FROM post_reviews
WHERE metadata ->> 'sentiment' = 'negative';
#
4. 메타데이터에 “language” 키가 포함된 행 찾기 #
SELECT *
FROM post_reviews
WHERE metadata ? 'language';
#
5. “topic"이 “productivity"이 아닌 리뷰만 출력 #
SELECT *
FROM post_reviews
WHERE NOT (metadata @> '{"topic": "productivity"}');
#
cf) GIN 인덱스
CREATE INDEX idx_post_reviews_metadata ON post_reviews USING GIN (metadata);