-- 회원 테이블
CREATE TABLE Users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
phone TEXT,
address TEXT,
registered_date TEXT DEFAULT (DATE('now'))
);
-- 도서 테이블
CREATE TABLE Books (
book_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
category TEXT,
total_copies INTEGER NOT NULL,
available_copies INTEGER NOT NULL
);
-- 대출 테이블
CREATE TABLE Loans (
loan_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
book_id INTEGER,
loan_date TEXT DEFAULT (DATE('now')),
due_date TEXT,
return_date TEXT,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (book_id) REFERENCES Books(book_id)
);
-- 저자 테이블
CREATE TABLE Authors (
author_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
bio TEXT
);
-- 분류 테이블
CREATE TABLE Categories (
category_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT
);

외래 키(Foreign Key)
어떤 테이블이 다른 테이블의 기본키(Primary Key) 값을 참조할 때 사용하는 열(컬럼)
FOREIGN KEY (user_id) REFERENCES Users(user_id)
FOREIGN KEY (book_id) REFERENCES Books(book_id)
Loans.user_id 값은 반드시 Users 테이블의 user_id 값 중 하나여야 한다. 즉, 없는 회원은 대출 기록을 가질 수 없다.
Loans.book_id 값도 반드시 Books 테이블의 book_id중 하나여야 한다. 즉, 등록되지 않은 책은 대출 기록에 쓸 수 없다.
-- 환자(Patient) 테이블
CREATE TABLE Patients (
patient_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
birthdate DATE NOT NULL,
gender TEXT CHECK(gender IN ('남', '여')),
phone TEXT NOT NULL,
email TEXT,
address TEXT
);
-- 의사(Doctor) 테이블
CREATE TABLE Doctors (
doctor_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
specialty TEXT NOT NULL,
phone TEXT NOT NULL,
email TEXT
);
-- 예약(Appointment) 테이블
CREATE TABLE Appointments (
appointment_id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER NOT NULL,
doctor_id INTEGER NOT NULL,
appointment_datetime DATETIME NOT NULL,
status TEXT DEFAULT '예약됨' CHECK(status IN ('예약됨', '완료', '취소')),
FOREIGN KEY (patient_id) REFERENCES Patients(patient_id) ON DELETE CASCADE,
FOREIGN KEY (doctor_id) REFERENCES Doctors(doctor_id) ON DELETE CASCADE

| 엔티티 이름 | 설명 |
|---|---|
| 차량(Vehicle) | 등록된 차량 정보 |
| 고객(Customer) | 차량 소유자 또는 사용자 |
| 입출차 기록(ParkingLog) | 입차 및 출차 시간 기록 |
| 요금(Fee) | 주차 시간에 따른 요금 정보 |
| 주차 구역(ParkingSlot) | 개별 주차 구역 정보 |
-- 고객 정보 테이블
CREATE TABLE Customer (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
phone VARCHAR(20)
);
-- 차량 정보 테이블
CREATE TABLE Vehicle (
id INT AUTO_INCREMENT PRIMARY KEY,
license_plate VARCHAR(20) UNIQUE NOT NULL,
type VARCHAR(20),
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES Customer(id)
);
-- 주차 구역 (슬롯) 테이블
CREATE TABLE ParkingSlot (
id INT AUTO_INCREMENT PRIMARY KEY,
zone VARCHAR(10),
is_occupied BOOLEAN DEFAULT FALSE
);
-- 요금 정책 테이블
CREATE TABLE Fee (
id INT AUTO_INCREMENT PRIMARY KEY,
fee_per_hour INT NOT NULL,
max_daily_fee INT DEFAULT 0
);
-- 입출차 기록 테이블
CREATE TABLE ParkingLog (
id INT AUTO_INCREMENT PRIMARY KEY,
vehicle_id INT NOT NULL,
slot_id INT NOT NULL,
entry_time DATETIME NOT NULL,
exit_time DATETIME,
fee_id INT,
FOREIGN KEY (vehicle_id) REFERENCES Vehicle(id),
FOREIGN KEY (slot_id) REFERENCES ParkingSlot(id),
FOREIGN KEY (fee_id) REFERENCES Fee(id)
);

# 사용자 테이블
CREATE TABLE User (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);
# 아티스트 테이블
CREATE TABLE Artist (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
# 앨범 테이블
CREATE TABLE Album (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
artist_id INT NOT NULL,
release_date DATE,
FOREIGN KEY (artist_id) REFERENCES Artist(id)
);
# 장르 테이블
CREATE TABLE Genre (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
# 노래 테이블
CREATE TABLE Song (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
duration INT NOT NULL, -- 초 단위
album_id INT,
genre_id INT,
FOREIGN KEY (album_id) REFERENCES Album(id),
FOREIGN KEY (genre_id) REFERENCES Genre(id)
);
# 재생목록 테이블
CREATE TABLE Playlist (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES User(id)
);
# 재생목록에 담긴 테이블
CREATE TABLE PlaylistSong (
id INT AUTO_INCREMENT PRIMARY KEY,
playlist_id INT NOT NULL,
song_id INT NOT NULL,
FOREIGN KEY (playlist_id) REFERENCES Playlist(id),
FOREIGN KEY (song_id) REFERENCES Song(id)
);
