Super type / Sub type 관계 → 어떤 타입을 정규화 했을까요???

전체 관계 설정 → 개념적 설계 단계에서 이미 전부 완료 했지만, 관계를 정리했습니다.

Super type / Sub type 관계에서 관계 정규화

Sup/sub 다대다 관계를 알맞게 정규화 + 나머지도 정규화

시작 테이블 끝 테이블 관계 차수 필수/선택 관계
study_group subject 1:1 필수 한 개의 스터디 그룹은
정확히 한 개의 과목과 관련이 있습니다.
study_group presentation 1:N 필수 한 개의 스터디 그룹은
정확히 한 개 이상의 발표와 관련이 있습니다.
study_group member 1:N 필수 한 개의 스터디 그룹은
정확히 한 개 이상의 회원과 관련이 있습니다.
study_group project 1:N 선택 한 개의 스터디 그룹은
선택적으로 한 개 이상의 프로젝트와 관련이 있습니다.
presentation_topic subject 1:1 선택 한 개의 발표 주제는
정확히 한 개의 과목과 관련이 있습니다.
presentation member 1:N 필수 한 개의 발표는
정확히 한 개 이상의 회원과 관련이 있습니다.
presentation presentation_topic 1:1 필수 한 개의 발표는
정확히 한 개의 발표 주제와 관련이 있습니다.
attend member 1:N 필수 한 개의 출석은
정확히 한 개 이상의 회원과 관련이 있습니다.
attend presentation 1:N 필수 한 개의 출석은
정확히 한 개 이상의 발표와 관련이 있습니다.
attend location 1:1 필수 한 개의 출석은
정확히 한 개의 장소와 관련이 있습니다.
penalty member 1:N 선택 한 개의 벌칙은
선택적으로 한 개 이상의 회원과 관련이 있습니다.
rule member 1:N 선택 한 개의 규칙은
선택적으로 한 개 이상의 회원과 관련이 있습니다.
membership_fee member 1:1 필수 한 명의 회원은
정확히 한 개의 회비를 납부할 수 있습니다.
membership_fee rule 1:1 필수 한 개의 회비는
정확히 한 개의 규칙과 관련이 있습니다.
project subject 1:1 선택 한 개의 프로젝트는
정확히 한 개의 과목과 관련이 있습니다.
project toy_project 1:1 선택 한 개의 프로젝트는
선택적으로 한 개의 장난감 프로젝트와 관련이 있습니다.
project side_project 1:1 선택 한 개의 프로젝트는
선택적으로 한 개의 사이드 프로젝트와 관련이 있습니다.
toy_project project 1:1 필수 한 개의 장난감 프로젝트는
정확히 한 개의 프로젝트와 관련이 있습니다.
toy_project_detail member 1:N 필수 한 개의 장난감 프로젝트세부 정보는
정확히 한 개 이상의 회원과 관련이 있습니다.
toy_project_detail project 1:1 필수 한 개의 장난감 프로젝트 세부 정보는
정확히 한 개의 장난감 프로젝트와 관련이 있습니다.
side_project project 1:1 필수 한 개의 사이드 프로젝트는
정확히 한 개의 프로젝트와 관련이 있습니다.
side_project_detail member 1:N 필수 한 개의 사이드 프로젝트 세부 정보는
정확히 한 개 이상의 회원과 관련이 있습니다.
side_project_detail project 1:1 필수 한 개의 사이드 프로젝트 세부 정보는
정확히 한 개의 사이드 프로젝트와 관련이 있습니다.
erDiagram
    "study_group" {
        INT group_id PK
        INT subject_id PK, FK "과목 ID"
        STRING group_name  "그룹 이름"
        STRING description  "그룹 설명"
        DATE foundation_date "그룹 설립일"
    }

    "presentation_topic" {
        INT topic_id PK
        INT presentation_id FK "발표 ID"
        INT subject_id FK "과목 ID"
        STRING topic_name "주제 이름"
        STRING description "주제 설명"
    }

    "presentation" {
        INT presentation_id PK
        INT member_id FK "멤버 ID"
        INT group_id FK "그룹 ID"
        DATE date_time "발표 일시"
        INT turn "발표 순번"
        STRING presentation_url "발표 링크"
    }

    "subject" {
        INT subject_id PK
        STRING subject_name "과목 이름"
        STRING description "과목 설명"
    }

    "member" {
        INT member_id PK
        STRING name "이름"
        STRING rule "룰"
        STRING email "이메일"
        STRING contact_number "연락처"
    }

    "attend" {
        STRING attend_id PK
        INT group_id FK  "그룹 ID"
        INT presentation_id FK "발표 ID"
        INT member_id FK "회원 ID"
        INT location_id FK
    }

    "penalty" {
        INT  member_id PK "회원 ID"
        INT sequence PK "패널티 카운트"
        INT  rule_id FK "룰 ID"
        STRING penalty_content "벌칙 내용"
        DATE imposition_date "적용 일자"
    }

    "rule" {
        INT rule_id PK
        INT group_id FK "그룹 ID"
        STRING rule_name "룰 이름"
        STRING description "룰 설명"

    }

    "membership_fee" {
        INT fee_id PK
        INT rule_id FK "룰 ID"
        INT member_id FK "멤버 ID"
        STRING fee_name "회비 이름"
        DECIMAL amount "금액"
        DATE payment_date "납부 일자"
    }

    "location" {
        INT location_id PK
        STRING location_name "장소 이름"
        STRING address "주소"
        STRING operating_hours "운영 시간"
    }
    "project" {
        INT project_id PK
        STRING project_type PK "프로젝트 타입"
        INT group_id FK "그룹 ID"
        INT subject_id FK "과목 ID" 
        STRING project_name "사이드 프로젝트 이름"
        STRING description "사이드 프로젝트 설명"
        DATE start_date "시작 일자"
        DATE end_date "종료 일자"
    }
    
    "toy_project" {
        INT project_id PK, FK
    }
    
    "toy_project_detail" {
        INT project_id PK, FK
        INT member_id FK "멤버 ID"
        INT turn PK "회차"
        STRING git_url "git url"
    }

    "side_project" {
        INT project_id PK, FK
    }

    "project_group" {
        INT project_group_id PK
        INT project_id FK
        INT member_id FK
        String Role
    }

    "side_project_detail" {
        INT project_id PK, FK
        INT turn PK "회차"
        INT member_id FK "멤버 ID"
        INT project_group FK "프로젝트 그룹 ID"
        STRING git_url "git url"
        STRING git_branch "git branch"
    }

study_group ||--|{ subject : "배우려"
study_group ||--o{ rule : "지키며"    
study_group ||--|{ presentation : "함께"
study_group ||--o{ project : "함께"
  
presentation }|--|| attend : "주제로"
presentation }|--|| member : "발표를"
presentation ||--|| presentation_topic : "에 대해"

attend ||--|{ location : "에 모여"

member ||--o{ attend : "참여하다"
member ||--|| penalty : "받다"

member ||--|{ membership_fee : "납부하다"
member |o--|{ toy_project_detail : "기여하다"
member |o--|{ side_project_detail : "기여하다"

project |o--|| toy_project : "주제"
project |o--|| side_project : "주제"
project ||--|{ subject : "실습"

toy_project ||--|{ toy_project_detail : "상세"
side_project ||--|{ side_project_detail : "상세"
side_project ||--|{ project_group : "그룹"
side_project_detail ||--|{ project_group : "팀으로"

rule ||--o{ membership_fee : "에 의해"
rule ||--|| penalty : "에 의해"

subject ||--|{ presentation_topic : "발표하려"