SQL #5 소셜미디어 포스트 리뷰 시스템

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);
image

#

3. sentiment가 negative인 리뷰만 출력 #

SELECT *
FROM post_reviews
WHERE metadata ->> 'sentiment' = 'negative';
image

#

4. 메타데이터에 “language” 키가 포함된 행 찾기 #

SELECT *
FROM post_reviews
WHERE metadata ? 'language';
image

#

5. “topic"이 “productivity"이 아닌 리뷰만 출력 #

SELECT *
FROM post_reviews
WHERE NOT (metadata @> '{"topic": "productivity"}');
image

#

cf) GIN 인덱스

CREATE INDEX idx_post_reviews_metadata ON post_reviews USING GIN (metadata);

#