데이터베이스 프롬프트
데이터베이스 설계와 SQL 생성에 AI를 활용하는 방법을 배웁니다. ERD, 테이블 설계, 쿼리 작성을 AI로 도와보세요.
개요
데이터베이스 설계와 SQL 쿼리 작성을 AI의 도움으로 효율적으로 수행할 수 있습니다. 이 가이드에서는 데이터베이스 관련 프롬프트를 활용하는 방법을 배웁니다.
- ERD 설계: 테이블 구조 설계
- SQL 쿼리: SELECT, INSERT, UPDATE, DELETE
- 마이그레이션: 스키마 변경 스크립트
- 최적화: 인덱스, 쿼리 최적화
- ORM 모델: Prisma, TypeORM, SQLAlchemy
- 데이터 마이그레이션: 데이터 변환, 이전 스크립트
지원 데이터베이스
AI는 다양한 데이터베이스 시스템에서 활용할 수 있습니다.
- 관계형 데이터베이스: PostgreSQL, MySQL, MariaDB, SQLite, Oracle
- 문서 데이터베이스: MongoDB, CouchDB
- 키-값 저장소: Redis, Amazon DynamoDB
- 시계열 데이터베이스: InfluxDB, TimescaleDB
- 그래프 데이터베이스: Neo4j, ArangoDB
- 트랜잭션 필수: PostgreSQL, MySQL (ACID 준수)
- 유연한 스키마: MongoDB (다양한 데이터 구조)
- 고속 캐시: Redis (메모리 기반)
- 간단한 프로토타이프: SQLite (파일 기반, 설정 불필요)
AI 기반 데이터베이스 설계 워크플로우
AI를 활용한 데이터베이스 개발은 반복적인 프롬프트 사이클을 통해 요구사항 분석부터 마이그레이션까지 전 과정을 효율적으로 수행합니다.
AI 기반 데이터베이스 설계 워크플로우 — 요구사항부터 마이그레이션까지의 반복 사이클
스키마 설계
데이터베이스 스키마를 설계합니다. AI는 요구사항을 분석하여 최적의 테이블 구조를 제안합니다.
테이블 설계 요청
블로그 데이터베이스 스키마를 설계해줘.
요구사항:
- users: id, email, password, name, created_at
- posts: id, title, content, author_id, created_at, updated_at
- comments: id, post_id, user_id, content, created_at
- categories: id, name, slug
- post_categories: post_id, category_id (다대다)
각 테이블의:
- 기본 키
- 외래 키
- 인덱스
- 데이터 타입
ERD 생성 요청
텍스트 기반 ERD나 다이어그램을 요청할 수 있습니다.
전자상거래 데이터베이스 ERD를 설계해줘.
엔티티:
- customers: 고객 정보 (id, name, email, phone, address)
- products: 상품 정보 (id, name, price, stock, category_id)
- orders: 주문 (id, customer_id, order_date, status, total_amount)
- order_items: 주문 상세 (id, order_id, product_id, quantity, price)
- categories: 카테고리 (id, name, parent_id)
- reviews: 리뷰 (id, product_id, customer_id, rating, comment)
출력:
- Mermaid 다이어그램 형식
- 각 관계의 Cardinality 명시
- 권장 인덱스 목록
정규화 요구사항
AI에게 정규화 수준을 명시하면 더 정확한 설계를 받을 수 있습니다.
- 1NF (제1정규형): 원자값만 허용 (복합 값 금지)
- 2NF (제2정규형): 부분 함수 종속 제거
- 3NF (제3정규형): 이행 함수 종속 제거
- BCNF (보이스-코드 정규형): 결정자 함수 종속 보장
3NF 정규화를 적용한 스키마를 설계해줘:
- 직원 테이블 (부서, 직책, 급여 정보 포함)
- 부서별 급여 등급 테이블
- 각 정규화 단계별 설명 포함
SQL 쿼리 생성
다양한 SQL 쿼리를 생성합니다. 구체적인 요구사항을 명시할수록 더 정확한 결과를 얻습니다.
SELECT 쿼리 요청
다음 조건의 SELECT 쿼리를 작성해줘:
테이블: posts
조인: users (author), categories
필터: 최근 30일 게시물, 공개 상태
정렬: 작성일 내림차순
페이지네이션: page, limit 파라미터
JOIN 쿼리 요청
게시물과 작성자 정보를 JOIN하는 쿼리를 작성해줘.
필요한 정보:
- 게시물 제목, 내용
- 작성자 이름, 이메일
- 카테고리 이름
- 댓글 수
집계 쿼리 요청
주문 데이터를 분석하는 쿼리를 작성해줘:
요구사항:
1. 일별 주문 수와 총 금액
2. 카테고리별 매출 순위 (상위 5개)
3. 고객별 총 주문 금액 (VIP 고객 추출)
4. 평균 주문 금액, 최대/최소 주문 금액
5. 월별 성장률 (전월 대비)
사용 테이블: orders, order_items, products, categories
서브쿼리 요청
다음 조건의 서브쿼리를 작성해줘:
1. 평균보다 많은 주문을 한 고객 조회
2. 최근 6개월 내 거래 없는 비활성 고객 조회
3. 재고가 없는 상품의 주문 건 조회
4. 각 카테고리에서 가장 판매량이 많은 상품 조회
테이블: customers, orders, order_items, products
Window 함수 요청
Window 함수를 사용한 분석 쿼리를 작성해줘:
1. 행 번호: 주문 내림차순 정렬, 번호 부여
2. 누적 합계: 일별 매출의 누적 합계
3. 이동 평균: 최근 3개월 평균 매출
4. 순위: 카테고리별 매출 순위
5. 비율: 전체 매출 대비 점유율
데이터베이스: PostgreSQL
데이터베이스별 차이점
- MySQL: LIMIT 지원, 문자열 연결 CONCAT()
- PostgreSQL: LIMIT/OFFSET, 문자열 연결 || 또는 CONCAT()
- SQLite: LIMIT 지원, 표현식 제한적
- SQL Server: TOP, OFFSET-FETCH
마이그레이션
스키마 마이그레이션 스크립트를 생성합니다. 데이터베이스 종류와 ORM을 명시하면 해당 환경에 맞는 스크립트를 생성합니다.
마이그레이션 요청
users 테이블에 bio 컬럼을 추가하는
마이그레이션을 작성해줘.
요구사항:
- 컬럼명: bio
- 타입: VARCHAR(500)
- 기본값: NULL
- ALTER TABLE 문으로
Prisma 마이그레이션
Prisma 스키마를 다음과 같이 변경하는 마이그레이션:
1. User 모델에 role 필드 추가 (기본값: 'user')
2. Post 모델에 published 필드 추가 (기본값: false)
3. Comment 모델 추가
4. 기존 데이터 마이그레이션 스크립트 포함
환경: PostgreSQL + Prisma
데이터 마이그레이션
데이터 마이그레이션 스크립트를 작성해줘:
시나리오:
- users 테이블의 name 필드를 first_name, last_name으로 분리
- email을 소문자로 통일
- created_at이 NULL인 레코드에 현재 시간 설정
- 마이그레이션 전후 데이터 검증 쿼리 포함
데이터베이스: MySQL
롤백 스크립트
- 백업: 마이그레이션 전 데이터 백업
- 순서: 마이그레이션 → 검증 → 롤백 스크립트 순서
- 테스트: 개발 환경에서 충분한 테스트
users 테이블에 email_verified 컬럼을 추가하는
마이그레이션과 대응되는 롤백 스크립트를 작성해줘:
- 컬럼: email_verified (BOOLEAN, 기본값 FALSE)
- 롤백: 컬럼 삭제
- 검증 쿼리 포함
ORM 모델
ORM 모델 코드를 생성합니다. 사용 중인 ORM과 프로그래밍 언어를 명시하면 해당 환경에 맞는 코드를 생성합니다.
Prisma 모델 요청
Prisma 스키마를 작성해줘.
테이블:
- User: id, email, name, posts, comments
- Post: id, title, content, author, comments, categories
- Comment: id, content, post, author
관계:
- User 1:N Post
- User 1:N Comment
- Post 1:N Comment
TypeORM 모델 요청
TypeORM Entity 클래스를 작성해줘:
환경: TypeScript + PostgreSQL
">엔- @Entity('users')
- @PrimaryGeneratedColumn()
- @Column() with type, length, nullable
- @OneToMany(), @ManyToOne() 관계
- @CreateDateColumn(), @UpdateDateColumn()
SQLAlchemy 모델 요청
SQLAlchemy 모델 클래스를 작성해줘:
환경: Python + PostgreSQL
테이블:
- User: id, email, name, password_hash, created_at
- Post: id, title, content, author_id, created_at
요구사항:
- Base 상속
- Column, Integer, String, DateTime 타입
- relationship(), backref()
- relationship 정의 (lazy='select')
Drizzle ORM 모델 요청
Drizzle ORM 스키마를 작성해줘:
환경: TypeScript + drizzle-orm + PostgreSQL
테이블:
- users: id, email, name, createdAt
- posts: id, title, content, authorId, createdAt
요구사항:
- pgTable 사용
- serial, varchar, timestamp 타입
- primaryKey, references()
- relations 정의
최적화
쿼리 최적화 권장을 받습니다. EXPLAIN 결과나 Slow Query Log를 공유하면 더 정확한 진단이 가능합니다.
최적화 요청
다음 SQL 쿼리를 최적화해줘.
```sql
SELECT * FROM posts
WHERE created_at > '2024-01-01'
AND author_id IN (SELECT id FROM users WHERE active = true)
ORDER BY created_at DESC
LIMIT 100;
```
인덱스 제안과 함께
인덱스 설계 요청
게시판 기능에 대한 인덱스 전략을 설계해줘.
주요 쿼리:
1. SELECT * FROM posts WHERE category_id = ? ORDER BY created_at DESC
2. SELECT * FROM posts WHERE author_id = ?
3. SELECT * FROM posts WHERE title LIKE '%검색어%'
4. SELECT COUNT(*) FROM posts WHERE status = 'published'
5. SELECT * FROM posts WHERE created_at BETWEEN ? AND ?
데이터 특성:
- 전체 게시물 수: 약 100만 건
- 일일 신규 게시물: 약 1,000건
- 검색 기능 자주 사용
쿼리 분석 요청
다음 EXPLAIN 결과를 분석해줘:
```sql
EXPLAIN ANALYZE
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2024-01-01'
GROUP BY u.id;
```
결과:
-> Aggregate (cost=1500.25..1500.30 rows=1 width=16)
-> Nested Loop Left Join (cost=5.50..1200.00 rows=50000 width=24)
파티셔닝 설계
- 대용량 테이블: 수천만 건 이상
- 범위 쿼리: 날짜/지역별 조회 빈번
- 데이터 보관: 과거 데이터 별도 관리
- 성능 이슈: 인덱스 크기 증가
PostgreSQL 파티셔닝 전략을 설계해줘:
테이블: logs
- id, event_type, payload, created_at
- 일일 약 100만 건 INSERT
- 주로 최근 30일 데이터 조회
- 1년 경과 후 삭제
요구사항:
- 파티션 키: created_at (월별)
- 파티션 관리 스크립트
- 인덱스 전략
보안
데이터베이스 보안 설계를 요청합니다.
권한 관리
PostgreSQL 권한 설계 방안을 작성해줘:
역할:
- admin: 전체 권한
- developer: 스키마 생성, 자신의 테이블 관리
- application: SELECT, INSERT, UPDATE, DELETE만
- readonly: SELECT only
요구사항:
-ROLLEN 생성 스크립트
- GRANT/REVOKE 문
- 행 수준 보안 (RLS) 포함
SQL 인젝션 방지
- 파라미터화 쿼리: Prepared Statement 사용
- 입력 검증: 화이트리스트 방식으로 검증
- ORM 사용: ORM이 자동으로 이스케이프
- 최소 권한: 애플리케이션 계정 권한 최소화
백업 및 복원
백업 및 복원 전략을 설계합니다.
백업 전략 요청
PostgreSQL 백업 전략을 설계해줘:
요구사항:
- 일일 전체 백업 (새벽 2시)
- 시간별 증분 백업
- 30일 보관
- 원격지 저장 (S3)
- 복원 시간 목표 (RTO): 4시간
- 복원 지점 목표 (RPO): 1시간
출력:
- 백업 스크립트 (cron)
- 복원 테스트 절차
- 검증 쿼리
트랜잭션 관리
트랜잭션 처리 패턴을 요청합니다.
트랜잭션 패턴
주문 처리 트랜잭션을 작성해줘:
시나리오:
1. 재고 확인
2. 재고 차감
3. 주문 생성
4. 결제 처리
5. 재고 부족 시 전체 롤백
요구사항:
- 격리 수준: SERIALIZABLE
-Deadlock 방지
- 재시도 로직
- TypeScript + TypeORM
다음 단계
데이터베이스 개발에 대해 더 자세히 배워보세요!
핵심 정리
- 스키마 설계: 테이블, 컬럼, 관계 정의
- SQL 쿼리: SELECT, JOIN, 필터링
- 마이그레이션: 스키마 변경 스크립트
- ORM 모델: Prisma, SQLAlchemy
- 최적화: 인덱스, 쿼리 성능