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 : "발표하려"