Create Table 은 번거로워 바드에게 맏겼습니다.
두가지가 있지만, 관계 생성이 번거로워 테이블 생성을 맏긴 뒤 생성 순서만 적절하게 지정해 주었습니다.
트랜잭션을 사용할 예정임으로 MySQL의 default engine(InnoDB)를 러프하게 지정해줬습니다.
create schema study;
use study;
CREATE TABLE member (
member_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
rule VARCHAR(255),
email VARCHAR(255) NOT NULL,
contact_number VARCHAR(255),
PRIMARY KEY (member_id)
);
CREATE TABLE subject (
subject_id INT NOT NULL AUTO_INCREMENT,
subject_name VARCHAR(255) NOT NULL,
description VARCHAR(255),
PRIMARY KEY (subject_id)
);
CREATE TABLE study_group (
group_id INT NOT NULL AUTO_INCREMENT,
subject_id INT NOT NULL,
group_name VARCHAR(255) NOT NULL,
description VARCHAR(255),
foundation_date DATE,
PRIMARY KEY (group_id),
FOREIGN KEY (subject_id) REFERENCES subject (subject_id)
);
CREATE TABLE location (
location_id INT NOT NULL AUTO_INCREMENT,
location_name VARCHAR(255) NOT NULL,
address VARCHAR(255),
operating_hours VARCHAR(255),
PRIMARY KEY (location_id)
);
CREATE TABLE project (
project_id INT NOT NULL AUTO_INCREMENT,
project_name VARCHAR(255) NOT NULL,
description VARCHAR(255),
start_date DATE NOT NULL,
end_date DATE,
project_type ENUM('TOY', 'SIDE') NOT NULL,
PRIMARY KEY (project_id)
);
CREATE TABLE toy_project (
project_id INT NOT NULL,
FOREIGN KEY (project_id) REFERENCES project (project_id)
);
CREATE TABLE side_project (
project_id INT NOT NULL,
FOREIGN KEY (project_id) REFERENCES project (project_id)
);
CREATE TABLE project_group (
project_group_id INT NOT NULL AUTO_INCREMENT,
project_id INT NOT NULL,
member_id INT NOT NULL,
role varchar(255) NOT NULL,
PRIMARY KEY (project_group_id),
FOREIGN KEY (member_id) REFERENCES member (member_id),
FOREIGN KEY (project_id) REFERENCES project (project_id)
);
CREATE TABLE rule (
rule_id INT NOT NULL AUTO_INCREMENT,
group_id INT NOT NULL,
rule_name VARCHAR(255) NOT NULL,
description VARCHAR(255),
PRIMARY KEY (rule_id),
FOREIGN KEY (group_id) REFERENCES study_group (group_id)
);
CREATE TABLE presentation (
presentation_id INT NOT NULL AUTO_INCREMENT,
member_id INT NOT NULL,
group_id INT NOT NULL,
date_time DATE NOT NULL,
turn INT NOT NULL,
presentation_url VARCHAR(255),
PRIMARY KEY (presentation_id),
FOREIGN KEY (member_id) REFERENCES member (member_id),
FOREIGN KEY (group_id) REFERENCES study_group (group_id)
);
CREATE TABLE presentation_topic (
topic_id INT NOT NULL AUTO_INCREMENT,
presentation_id INT NOT NULL,
subject_id INT NOT NULL,
topic_name VARCHAR(255) NOT NULL,
description VARCHAR(255),
PRIMARY KEY (topic_id),
FOREIGN KEY (presentation_id) REFERENCES presentation (presentation_id),
FOREIGN KEY (subject_id) REFERENCES subject (subject_id)
);
CREATE TABLE attend (
attend_id INT NOT NULL AUTO_INCREMENT,
group_id INT NOT NULL,
presentation_id INT NOT NULL,
member_id INT NOT NULL,
location_id INT NOT NULL,
PRIMARY KEY (attend_id),
FOREIGN KEY (group_id) REFERENCES study_group (group_id),
FOREIGN KEY (presentation_id) REFERENCES presentation (presentation_id),
FOREIGN KEY (member_id) REFERENCES member (member_id),
FOREIGN KEY (location_id) REFERENCES location (location_id)
);
CREATE TABLE penalty (
member_id INT NOT NULL AUTO_INCREMENT,
sequence INT NOT NULL,
rule_id INT NOT NULL,
penalty_content VARCHAR(255),
imposition_date DATE,
PRIMARY KEY (member_id),
FOREIGN KEY (rule_id) REFERENCES rule (rule_id)
);
CREATE TABLE membership_fee (
fee_id INT NOT NULL AUTO_INCREMENT,
rule_id INT NOT NULL,
member_id INT NOT NULL,
fee_name VARCHAR(255) NOT NULL,
amount DECIMAL(10,2),
payment_date DATE,
PRIMARY KEY (fee_id),
FOREIGN KEY (rule_id) REFERENCES rule (rule_id),
FOREIGN KEY (member_id) REFERENCES member (member_id)
);