RDBMS 관련된 실습을 진행하기 위해 더미데이터를 만드려고 합니다. DB, MySQL 관련 실습하는데 필요하신 분들이나 더미데이터 필요한데 시간 아끼고 싶은 분들은 그대로 가져다 쓰시면 될 것 같습니다.
기본 테이블 생성 및 테이블간 제약관계만 생성하고 인덱싱같은 부분들은 고려를 안했습니다.(실행 계획 뜯어서 인덱스 걸고 개선하는 실습도 하기 위함)
평범한 커뮤니티를 생각하고 설계한 ERD입니다.
CREATE DATABASE IF NOT EXISTS community;
USE community;
순서대로 Ctrl C+V 하고 실행하면 생성됩니다.
CREATE TABLE IF NOT EXISTS USER (
id BIGINT NOT NULL AUTO_INCREMENT,
password VARCHAR(255) NOT NULL,
age BIGINT NOT NULL,
nickname VARCHAR(25) NOT NULL,
gender VARCHAR(25) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS CATEGORY (
id BIGINT NOT NULL AUTO_INCREMENT,
category_name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS POST (
id BIGINT NOT NULL AUTO_INCREMENT,
user BIGINT NOT NULL,
category BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
createdAt DATETIME NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (user) REFERENCES USER(id),
FOREIGN KEY (category) REFERENCES CATEGORY(id)
);
CREATE TABLE IF NOT EXISTS COMMENT (
user BIGINT NOT NULL,
post BIGINT NOT NULL,
content VARCHAR(255) NOT NULL,
createdAt DATETIME NOT NULL,
FOREIGN KEY (user) REFERENCES USER(id),
FOREIGN KEY (post) REFERENCES POST(id)
);
삽입할 row 개수
USER
: 10000 rows
CATEGORY
: 10 rows
POST
: 100000 rows
COMMENT
: 2000000 rows
USER
와 CATEGORY
테이블부터 더미데이터를 생성DELIMITER $$
DROP PROCEDURE IF EXISTS insertDummyData$$
CREATE PROCEDURE insertDummyData()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE randGender VARCHAR(5);
DECLARE randNickname VARCHAR(255);
-- USER 테이블에 더미 데이터 삽입
WHILE i <= 10000 DO
-- 남성 또는 여성 성별 랜덤하게 설정
IF RAND() < 0.5 THEN
SET randGender = 'MEN';
ELSE
SET randGender = 'WOMEN';
END IF;
-- 랜덤 닉네임 생성
SET randNickname = CONCAT('User', LPAD(FLOOR(RAND()*1000000), 6, '0'));
INSERT INTO USER (password, age, gender, nickname) VALUES (CONCAT('pass', FLOOR(RAND()*1000000)), FLOOR(RAND()*82)+18, randGender, randNickname);
SET i = i + 1;
END WHILE;
SET i = 1;
-- CATEGORY 테이블에 더미 데이터 삽입
WHILE i <= 10 DO
INSERT INTO CATEGORY (category_name) VALUES (CONCAT('category ', i));
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
-- 프로시저 호출
CALL insertDummyData();
COUNT
문으로 의도한 개수만큼 데이터가 생성되었는지 확인SELECT count(*) from user;
SELECT count(*) from category;
POST
테이블에 더미데이터를 생성Post 더미데이터
DELIMITER $$
DROP PROCEDURE IF EXISTS insertPostDummyData$$
CREATE PROCEDURE insertPostDummyData()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE randomUser INT;
DECLARE randomCategory INT;
DECLARE randomTitle VARCHAR(255);
DECLARE randomContent TEXT;
-- POST 테이블에 더미 데이터 삽입
WHILE i <= 100000 DO
-- 유저 ID와 카테고리 ID를 랜덤으로 설정
SET randomUser = FLOOR(RAND() * (10000 - 1 + 1)) + 1;
SET randomCategory = FLOOR(RAND() * 10) + 1;
-- 랜덤 타이틀과 컨텐츠 생성
SET randomTitle = CONCAT('Title ', LPAD(i, 5, '0'));
SET randomContent = CONCAT('Content for post ', LPAD(i, 5, '0'));
INSERT INTO POST (user, category, title, content, createdAt)
VALUES (randomUser, randomCategory, randomTitle, randomContent, NOW());
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
-- 스토어드 프로시저 호출useruser
CALL insertPostDummyData();
COUNT
문으로 의도한 개수만큼 데이터가 생성되었는지 확인SELECT count(*) from post;
COMMENT
테이블에 더미데이터를 생성
DROP PROCEDURE IF EXISTS insertCommentDummyData;
DELIMITER $$
CREATE PROCEDURE insertCommentDummyData()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE randomUser BIGINT;
DECLARE randomPost BIGINT;
DECLARE randomContent VARCHAR(255);
DECLARE randomCreatedAt DATETIME;
WHILE i <= 2000000 DO
-- User ID와 Post ID를 랜덤으로 생성
SET randomUser = FLOOR(RAND() * (10000 - 1 + 1)) + 1;
SET randomPost = FLOOR(RAND() * (100000 - 1 + 1)) + 1;
-- 랜덤 컨텐트 생성
SET randomContent = CONCAT('Comment ', LPAD(i, 5, '0'));
-- 랜덤 createdAt 생성 (2023년 1월 1일부터 2023년 10월 31일 사이)
SET randomCreatedAt = ADDDATE('2023-01-01', FLOOR(RAND() * (304))); -- 2023년은 365일 중 304일이 10월 31일까지임
-- 데이터 삽입
INSERT INTO COMMENT (user, post, content, createdAt)
VALUES (randomUser, randomPost, randomContent, randomCreatedAt);
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
-- 스토어드 프로시저 호출
CALL insertCommentDummyData();
COUNT
문으로 의도한 개수만큼 데이터가 생성되었는지 확인