졸려. 몰라. 몰라몰라병이야. 몰라..콜라.. 콜라 마시고 싶다.
오전 수업시간에 뭘 배운 거지. DB 모델링을 본격적으로 진행하는데, 진짜 어떻게 받아들여야할 지 모르겠어요..

: 데이터 모델링은 정보를 어떻게 저장하고 관리할지 설계하는 과정.
예시:친구들의 정보를 이름, 전화번호, 생일 같은 걸 적어야 함.
표로 정리하면, 보기 매우 편함. -> 데이터 모델링
(이렇게 파일 정리하고 하는 거 완전 내 style)
: 누구랑 누구 사이에 어떤 관계가 있는지 그림으로 그려보는 것.
=> 실제 데이터베이스로 만들기 전, 머릿속 설계를 눈에 보이게 정리하는 단계.
예시)
1) 엔티티(Entity): 정보로 저장하고 싶은 대상, 즉 ‘명사’들
학생
수업
선생님
2) 속성(Attribute): 각 엔티티가 가진 특징
학생 → 학번, 이름, 생일
수업 → 수업코드, 수업명
선생님 → 선생님ID, 이름
- 2.2.1. 주 식별자
엔티티에 있는 데이터들을 서로 구분을 해 줄 수 있는 속성을 의미한다.- 2.2.2. 보조 식별자
보조 식별자는 주 식별자를 대체할 수 있는 또 다른 속성을 의미한다.- 2.2.3. 외래 식별자
엔티티와의 관계를 연결해 주는 식별자를 외부 식별자라고 한다.
3) 관계(Relationship): 엔티티들 사이의 연결
학생은 수업을 듣는다
선생님은 수업을 가르친다
(컴활 따는 것 같아요.. 많이 해봐야 알겠구만)
[학생] -------- 듣는다 -------- [수업] -------- 가르친다 -------- [선생님]
학생 속성: 학번, 이름
수업 속성: 수업코드, 수업명
선생님 속성: 선생님ID, 이름
예시)
[회원] -------- 빌린다 -------- [책]
[선수] -------- 소속된다 -------- [팀]
1:1 → 하나의 학생이 하나의 사물함만 가짐
1:N → 한 명의 선생님이 여러 수업을 가르침
M:N → 여러 학생이 여러 수업을 듣는다
| 용어 | 뜻 | 예시 |
|---|---|---|
| 개념적 모델링 | 누가 무엇과 연결되는지 그림으로 나타내는 것 | 학생 - 듣는다 - 수업 |
| 관계(Relationship) | 두 엔티티의 연결 | 학생 ↔ 수업, 선생님 ↔ 수업 |
=> 위의 그림을 표로 옮겨서 실제로 컴퓨터에 저장할 수 있게 더 구체적으로 만드는 단계.

실제 데이터베이스 프로그램(MySQL, Oracle 등)에서 쓸 수 있도록 설계하는 것. 진짜 컴퓨터에 저장함.
=> 논리적 모델링에서 만든 표(테이블)를 진짜 컴퓨터 안에 저장할 수 있도록 구체적으로 만드는 것.
말로 하자면: "이제 그림도 그리고, 표도 만들었으니까, 진짜 데이터베이스에 넣어서 쓰자!" 이 단계야.
🧠 개념적 모델링:
“내가 필요한 준비물은 연필, 지우개, 공책이야!”
→ 필요한 걸 머릿속으로 정리해!
📋 논리적 모델링:
“이걸 표로 써볼까?”
→ 연필: 3자루, 지우개: 2개, 공책: 1권
🛒 물리적 모델링:
“이제 마트 가서 진짜 물건을 사자!”
→ 컴퓨터에 데이터를 진짜로 넣을 준비를 하는 거지!
왜 정규화를 해?
: 중복을 줄이고, 데이터 오류를 막기 위해서!
예시
: 정리 안 된 책상 위에 연필, 지우개, 간식이 뒤섞여 있으면 찾기도 어렵고 정리도 힘듦.
→ 그걸 펜통, 서랍, 간식통에 따로 넣는 것!
→ 이게 바로 정규화야!
| 학생이름 | 수업명 | 선생님이름 | 강의실 |
|---|---|---|---|
| 철수 | 수학 | 이선생 | 101호 |
| 철수 | 과학 | 김선생 | 102호 |
| 영희 | 수학 | 이선생 | 101호 |
| 학번 | 이름 |
|---|---|
| S001 | 철수 |
| S002 | 영희 |
| 수업코드 | 수업명 | 선생님이름 | 강의실 |
|---|---|---|---|
| C101 | 수학 | 이선생 | 101호 |
| C102 | 과학 | 김선생 | 102호 |
| 학번 | 수업코드 |
|---|---|
| S001 | C101 |
| S001 | C102 |
| S002 | C101 |
???) 정규화 전이 더 보기 편한 것 같은데
눈으로 보기엔 편함. 하지만 컴퓨터가 저장하거나 관리하기에는 문제가 많아!
❗정규화를 하지 않으면 생기는 문제들
① 중복이 많아짐
-> “이선생”이라는 이름이 여러 줄에 반복됨 → 공간 낭비
② 수정이 힘들어짐
-> 만약 “101호 → 103호”로 바뀌면? → 수학 수업이 있는 모든 줄을 찾아서 바꿔야 함.
③ 삭제할 때 정보까지 같이 사라짐 (삭제 이상)
-> 예: 철수가 수업을 전부 안 듣게 되어서 그의 줄을 다 지움
→ 그럼 “수학” 수업 정보도 없어져! 😱
→ 수업 자체가 사라진 것처럼 돼버림…
| 단계 | 이름 | 핵심 아이디어 | 쉬운 설명 |
|---|---|---|---|
| 1NF | 제1정규형 | 한 칸엔 하나의 값만! | 표에 “콤마(,)로 두 개 이상” 들어있으면 안 돼 |
| 2NF | 제2정규형 | 부분만 연결된 정보는 분리! | 전체 키가 아닌 일부랑만 관련된 건 따로 떼기 |
| 3NF | 제3정규형 | 간접적인 정보도 분리! | A → B → C처럼 간접 연결된 건 끊어줘야 |
| BCNF | 보이스-코드 정규형 | 3NF보다 조금 더 엄격함 | 키 후보가 여러 개일 때도 확실하게 정리 |
| 4NF | 제4정규형 | 여러 값이 따로따로 반복되면 분리 | 하나의 키가 여러 엔티티랑 복잡하게 얽힐 때 |
| 5NF | 제5정규형 | 모든 관계가 완전히 나뉘어야 함 | 조합 가능한 모든 경우를 깔끔하게 표현 |
✅ 1NF (제1정규형):
"하나의 칸에 하나의 값만 넣자!"
✅ 2NF (제2정규형):
"표의 키 전체와 관련된 것만 남기자!"
예: “수강” 테이블에 수업 이름이 들어있다면 ❌
→ 그건 수업코드에만 관련된 거니까 수업 테이블로 분리해야 해!
✅ 3NF (제3정규형):
"간접적으로 연결된 것도 분리하자!"
예: 학생 테이블에 학과 코드도 있고, 학과 이름도 있음.
→ 근데 학과 이름은 학과 코드에 따라 정해지는 거잖아?
→ 그럼 학과 정보는 따로 빼는 게 맞아!
✅ BCNF (보이스-코드 정규형):
3NF보다 더 엄격하게 키 중심으로 정리!
후보키가 여러 개일 때도, 모든 게 키에만 의존해야 해.
✅ 4NF, 5NF (잘 안 쓰이지만 참고로!)
4NF: "하나의 키가 두 개의 다른 정보랑 반복적으로 연결될 때 정리!"
5NF: "복잡한 조합 관계가 있을 때 정확하게 분리!"
👉 이건 실제 개발할 때도 거의 안 나옴, 고급 상황이야.
✅ 팁 ①: 이 값은 어떤 걸 보면 정해지는가?
예: "수업명은 수업코드만 보면 자동으로 나옴"
👉 이건 수업코드에만 의존함
✅ 팁 ②: 이 값을 하나만 고쳐도 정보가 이상해질까?
수업명이 여러 줄에 반복되고, 하나만 바꾸면 다른 줄이 틀려짐
👉 그럼 이건 정리(분리)해야 해!
✅ 팁 ③: 이건 '누구'에 대한 정보인가?
학생에 대한 정보? → 학생 테이블
수업에 대한 정보? → 수업 테이블
둘 사이의 연결만? → 수강 테이블
“누구의 특징인지”만 생각해도 많이 도움 돼!
이렇게 나눠 보라고 하네요.
정리)
| 단계 | 하는 일 |
|---|---|
| 데이터 모델링 | 정보를 잘 정리하는 전체 과정 |
| 개념적 모델링 | 그림으로 관계를 표현 |
| 논리적 모델링 | 표로 변환 |
| 물리적 모델링 | 진짜 DB로 만드는 설계 |
| 정규화 | 중복을 줄이고 오류를 막는 정리법 |

이렇게 정리했지만, 모르겠음. 이론 이해하는 것부터 너무 오래걸림. 이거 오전에 다 나갔는데. 오후 진도 못 따라가는 중.. 오늘은 너무 어렵당ㅠㅠ 어려우니까, 이제 회피성 회로 하고 싶어져여
테이블은 정보를 담는 표야!
번호 이름 나이
1 철수 12
2 영희 11
이런 표를 테이블이라고 해.
엑셀 파일처럼 정보들을 칸에 정리해서 넣는 것이야!
데이터베이스에 표를 만들려면 이렇게 말해줘:
CREATE TABLE 학생 (
번호 INT,
이름 VARCHAR(20),
나이 INT
);
정보를 아무렇게나 넣지 못하게 규칙을 정해두는 것이야!
⭐ 3.1. PRIMARY KEY (기본 키)
→ 이 표에서 각 사람을 구별하는 번호야.
📌 예: 철수랑 영희의 번호가 같으면 안 되지? 그래서 규칙을 만드는 거야.
🌟 3.2. UNIQUE (중복 금지)
→ 같은 값이 또 있으면 안 돼!
→ 같은 이름은 한 번만 쓸 수 있어.
🧷 3.3. FOREIGN KEY (다른 표랑 연결)
→ 다른 표에 있는 값이랑 이어지는 값이야!
반코드 VARCHAR(10) REFERENCES 반(반코드)
→ 학생표의 반코드는, 반표에 있는 반코드 중 하나여야만 입력할 수 있어!
✅ 3.4. CHECK (제한 조건)
→ 이 칸에는 특정 값만 넣을 수 있어!
성별 CHAR(2) CHECK(성별 IN ('남자', '여자'))
→ 성별은 ‘남자’ 아니면 ‘여자’만 OK!
✏️ 4. 테이블을 고치고 싶을 땐?
표에 칸을 추가하거나 바꾸거나 없애고 싶을 때
➕ 칸(열) 추가하기
ALTER TABLE 학생 ADD 키 INT;
→ '키'라는 칸을 새로 만듬!
🖊️ 칸 내용 바꾸기 (예: 자료형, 기본값 등)
ALTER TABLE 학생 MODIFY 이름 VARCHAR(30);
→ 이름을 더 길게 쓸 수 있도록 수정!
🗑️ 칸 삭제하기
ALTER TABLE 학생 DROP COLUMN 나이;
→ '나이' 칸 없애버리기!
💥 5. 테이블 지우기
DROP TABLE 학생;
→ 이건 진짜 조심!
→ 만든 표 전체가 날아가! ❌❌❌
Heidi SQL 실습과 같이 작성할 수가 없었어요.. 정말 정신 없었거든요. 실습내용은 gpt한테 물어보면서 정리해볼게여..(오늘은 아님)