stock id 를 ticker로 하면 조회 속도가 상승할 것 같음
ticker market_type, market_cap, company_name, category, company_overview

DROP DATABASE IF EXISTS disclo;
CREATE DATABASE disclo;
USE disclo;
-- 사용자 테이블
CREATE TABLE user (
user_id VARCHAR(36) PRIMARY KEY, -- UUID 사용
nickname VARCHAR(255) NOT NULL, -- 닉네임
password_hash VARCHAR(255) NOT NULL, -- 비밀번호 (해시 저장)
email VARCHAR(255) NOT NULL, -- 이메일
birth_date VARCHAR(7), -- 생년월일 (YYYY-MM-DD 형식, 뒷자리 첫 번째 자리까지)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 생성 날짜
profile_color VARCHAR(20), -- 프로필 배경 색상 코드
user_type ENUM('ADMIN', 'GUEST') NOT NULL -- 유저 타입 추가 (ENUM)
);
-- 주식 정보 테이블
CREATE TABLE stock (
stock_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 주식 정보 테이블
market_cap BIGINT, -- 시가 총액(단위: 억)
ticker VARCHAR(10) NOT NULL, -- 주식 티커
market_type ENUM('KOSPI', 'KOSDAQ') NOT NULL, -- 마켓 타입 추가 (ENUM)
company_name VARCHAR(255) NOT NULL, -- 회사 이름
category VARCHAR(100), -- 카테고리
company_overview TEXT -- 회사 개요
);
-- 일봉 데이터 테이블
CREATE TABLE stock_price_day (
stock_price_day_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 일봉 데이터 테이블
stock_id BIGINT NOT NULL, -- 주식과의 관계
date DATE NOT NULL, -- 날짜
open_price INT NOT NULL, -- 시가
high_price INT NOT NULL, -- 고가
low_price INT NOT NULL, -- 저가
close_price INT NOT NULL, -- 종가
volume BIGINT, -- 거래량
change_rate FLOAT, -- 변동률
FOREIGN KEY (stock_id) REFERENCES stock(stock_id) ON DELETE CASCADE
);
-- 주봉 데이터 테이블
CREATE TABLE stock_price_week (
stock_price_week_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 주봉 데이터 테이블
stock_id BIGINT NOT NULL, -- 주식과의 관계
date DATE NOT NULL, -- 날짜
open_price INT NOT NULL, -- 시가
high_price INT NOT NULL, -- 고가
low_price INT NOT NULL, -- 저가
close_price INT NOT NULL, -- 종가
volume BIGINT, -- 거래량
change_rate FLOAT, -- 변동률
FOREIGN KEY (stock_id) REFERENCES stock(stock_id) ON DELETE CASCADE
);
-- 월봉 데이터 테이블
CREATE TABLE stock_price_month (
stock_price_month_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 월봉 데이터 테이블
stock_id BIGINT NOT NULL, -- 주식과의 관계
date DATE NOT NULL, -- 날짜
open_price INT NOT NULL, -- 시가
high_price INT NOT NULL, -- 고가
low_price INT NOT NULL, -- 저가
close_price INT NOT NULL, -- 종가
volume BIGINT, -- 거래량
change_rate FLOAT, -- 변동률
FOREIGN KEY (stock_id) REFERENCES stock(stock_id) ON DELETE CASCADE
);
-- 공시 테이블
CREATE TABLE announcement (
announcement_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 공시 테이블
stock_id BIGINT NOT NULL, -- 주식과의 관계
title VARCHAR(255) NOT NULL, -- 공시 제목
content TEXT NOT NULL, -- 공시 내용
announcement_date DATE NOT NULL, -- 공시 날짜
submitter VARCHAR(255), -- 제출자
original_announcement_url VARCHAR(255), -- 원문 공시 URL
announcement_type ENUM('정기공시', '주요사항보고', '외부감사관련', '발행공시', '지분공시', '자산유동화', '거래소공시', '기타공시', '공정위공시') NOT NULL, -- 공시 종류
FOREIGN KEY (stock_id) REFERENCES stock(stock_id) ON DELETE CASCADE
);
-- 댓글 테이블
CREATE TABLE comment (
comment_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 댓글 테이블
announcement_id BIGINT NOT NULL, -- 공시와의 관계
user_id VARCHAR(36), -- 사용자 ID (UUID)
content TEXT NOT NULL, -- 댓글 내용
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 생성 날짜
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 업데이트 시간
FOREIGN KEY (announcement_id) REFERENCES announcement(announcement_id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
-- 피드백 테이블
CREATE TABLE feedback (
feedback_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 피드백 테이블
announcement_id BIGINT NOT NULL, -- 공시와의 관계
user_id VARCHAR(36), -- 사용자 ID (UUID)
type ENUM('POSITIVE', 'NEGATIVE') NOT NULL, -- 피드백 유형
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 생성 날짜
FOREIGN KEY (announcement_id) REFERENCES announcement(announcement_id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
-- 관심 종목 테이블
CREATE TABLE favorite_stock (
favorite_stock_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 관심 종목 테이블
user_id VARCHAR(36), -- 사용자 ID (UUID)
stock_id BIGINT NOT NULL, -- 주식과의 관계
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE,
FOREIGN KEY (stock_id) REFERENCES stock(stock_id) ON DELETE CASCADE
);
-- 관심 공시 테이블
CREATE TABLE favorite_announcement (
favorite_announcement_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 관심 공시 테이블
user_id VARCHAR(36), -- 사용자 ID (UUID)
announcement_id BIGINT NOT NULL, -- 공시와의 관계
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE,
FOREIGN KEY (announcement_id) REFERENCES announcement(announcement_id) ON DELETE CASCADE
);
@startuml
entity "User" {
+ user_id : CHAR(36) <<PK>> // UUID 사용
+ nickname : string // 닉네임
+ password_hash : string // 비밀번호 (해시 저장)
+ email : string // 이메일
+ birth_date : CHAR(7) // 생년월일 (YYYY-MM-DD 형식, 뒷자리 첫 번째 자리까지)
+ created_at : datetime
+ profile_color : CHAR(20) // 프로필 배경 색상 코드
+ user_type : ENUM('ADMIN', 'GUEST') // 유저 타입 추가 (ENUM)
}
entity "Stock" {
+ id : Long <<PK>> // 주식 정보 테이블
+ market_cap : Long // 시가 총액
+ ticker : VARCHAR(10) // 주식 티커
+ market_type : ENUM('KOSPI', 'KOSDAQ') // 마켓 타입 추가 (ENUM)
+ company_name : string // 회사 이름
+ category : string // 카테고리
+ company_overview : TEXT // 회사 개요
}
entity "StockPriceDay" {
+ id : Long <<PK>> // 일봉 데이터 테이블
+ stock_id : Long <<FK>> // 주식과의 관계
+ date : DATE NOT NULL // 날짜
+ open_price : Long NOT NULL // 시가
+ high_price : Long NOT NULL // 고가
+ low_price : Long NOT NULL // 저가
+ close_price : Long NOT NULL // 종가
+ volume : BIGINT // 거래량
+ change_rate : FLOAT // 변동률
}
entity "StockPriceWeek" {
+ id : Long <<PK>> // 주봉 데이터 테이블
+ stock_id : Long <<FK>> // 주식과의 관계
+ date : DATE NOT NULL // 날짜
+ open_price : Long NOT NULL // 시가
+ high_price : Long NOT NULL // 고가
+ low_price : Long NOT NULL // 저가
+ close_price : Long NOT NULL // 종가
+ volume : BIGINT // 거래량
+ change_rate : FLOAT // 변동률
}
entity "StockPriceMonth" {
+ id : Long <<PK>> // 월봉 데이터 테이블
+ stock_id : Long <<FK>> // 주식과의 관계
+ date : DATE NOT NULL // 날짜
+ open_price : Long NOT NULL // 시가
+ high_price : Long NOT NULL // 고가
+ low_price : Long NOT NULL // 저가
+ close_price : Long NOT NULL // 종가
+ volume : BIGINT // 거래량
+ change_rate : FLOAT // 변동률
}
entity "Announcement" {
+ announcement_id : Long <<PK>> // 공시 테이블
+ stock_id : Long <<FK>> // 주식과의 관계
+ title : VARCHAR(255) NOT NULL // 공시 제목
+ content : TEXT NOT NULL // 공시 내용
+ announcement_date : DATE NOT NULL // 공시 날짜
+ submitter : string // 제출자
+ original_announcement_url : string // 원문 공시 URL
+ announcement_type : ENUM('정기공시', '주요사항보고', '외부감사관련', '발행공시', '지분공시', '자산유동화', '거래소공시', '기타공시', '공정위공시')
}
entity "Comment" {
+ comment_id : Long <<PK>> // 댓글 테이블
+ announcement_id : Long <<FK>> // 공시와의 관계
+ user_id : CHAR(36) <<FK>> // 사용자 ID (UUID)
+ content : TEXT NOT NULL // 댓글 내용
+ created_at : datetime // 생성 날짜
+ updated_at : datetime // 업데이트 시간
}
entity "Feedback" {
+ feedback_id : Long <<PK>> // 피드백 테이블
+ announcement_id : Long <<FK>> // 공시와의 관계
+ user_id : CHAR(36) <<FK>> // 사용자 ID (UUID)
+ type : ENUM('positive', 'negative') NOT NULL // 피드백 유형
+ created_at : datetime // 생성 날짜
}
entity "FavoriteStock" {
+ favorite_id : Long <<PK>> // 관심 종목 테이블
+ user_id : CHAR(36) <<FK>> // 사용자 ID (UUID)
+ stock_id : Long <<FK>> // 주식과의 관계
}
entity "FavoriteAnnouncement" {
+ favorite_id : Long <<PK>> // 관심 공시 테이블
+ user_id : CHAR(36) <<FK>> // 사용자 ID (UUID)
+ announcement_id : Long <<FK>> // 공시와의 관계
}
' Relationships
User ||--o{ Comment : writes
User ||--o{ Feedback : gives
User ||--o{ FavoriteStock : saves
User ||--o{ FavoriteAnnouncement : saves
Stock ||--o{ Announcement : has
Stock ||--o{ StockPriceDay : has
Stock ||--o{ StockPriceWeek : has
Stock ||--o{ StockPriceMonth : has
Announcement ||--o{ Comment : has
Announcement ||--o{ Feedback : has
Announcement ||--o{ FavoriteAnnouncement : saved by
Stock ||--o{ FavoriteStock : saved by // 주식과 관심 주식 연결
@enduml
stock 테이블
stockpriceday