이론
실습
초등학교 데이터베이스 (아주 간단한 버전!)
나무처럼 생각해보기
데이터베이스는 큰 나무와 같아요!
•
줄기 (Primary Key가 있는 테이블): 가장 중요한 정보를 담고 있어요
•
가지 (Foreign Key가 있는 테이블): 줄기에서 뻗어나온 추가 정보예요
학생 테이블 (줄기 테이블)
CREATE TABLE 학생 (
학번 INT PRIMARY KEY, -- 이게 바로 Primary Key!
이름 VARCHAR(20),
학년 INT,
반 INT
);
SQL
복사
학생 데이터:
학번 | 이름 | 학년 | 반 |
101 | 김민수 | 3 | 2 |
102 | 이지영 | 3 | 2 |
103 | 박서준 | 4 | 1 |
104 | 최하은 | 5 | 3 |
105 | 정우진 | 6 | 1 |
급식 테이블 (가지 테이블 1)
CREATE TABLE 급식 (
번호 INT PRIMARY KEY,
학번 INT, -- 이게 Foreign Key! 학생 테이블과 연결돼요
날짜 DATE,
먹었나요 VARCHAR(5),
FOREIGN KEY (학번) REFERENCES 학생(학번)
);
SQL
복사
급식 데이터:
번호 | 학번 | 날짜 | 먹었나요 |
1 | 101 | 2024-03-04 | 예 |
2 | 102 | 2024-03-04 | 예 |
3 | 103 | 2024-03-04 | 아니오 |
4 | 101 | 2024-03-05 | 예 |
5 | 104 | 2024-03-05 | 예 |
도서대출 테이블 (가지 테이블 2)
CREATE TABLE 도서대출 (
대출번호 INT PRIMARY KEY,
학번 INT, -- 이것도 Foreign Key! 학생 테이블과 연결돼요
책이름 VARCHAR(50),
빌린날짜 DATE,
FOREIGN KEY (학번) REFERENCES 학생(학번)
);
SQL
복사
도서대출 데이터:
대출번호 | 학번 | 책이름 | 빌린날짜 |
1 | 101 | 해리포터 | 2024-03-01 |
2 | 103 | 어린왕자 | 2024-03-02 |
3 | 102 | 개구리왕자 | 2024-03-03 |
4 | 101 | 신데렐라 | 2024-03-04 |
5 | 105 | 백설공주 | 2024-03-05 |
나무로 설명하는 데이터베이스 구조
줄기 = Primary Key가 있는 중심 테이블
학생 테이블이 나무의 줄기예요!
•
학번(Primary Key)은 각 학생의 특별한 번호예요
•
101번 김민수는 이 세상에 단 한 명뿐!
•
줄기가 없으면 가지도 없어요
가지 = Foreign Key가 있는 테이블들
[학생 테이블] ← 줄기
|
-------+-------
| |
[급식 테이블] [도서대출 테이블] ← 가지들
Plain Text
복사
급식 테이블과 도서대출 테이블은 나무의 가지예요!
•
가지는 항상 줄기에 연결되어 있어요
•
Foreign Key(학번)가 바로 그 연결고리!
•
"101번 학생이 무슨 책을 빌렸지?" 이런 질문에 답할 수 있어요
쉽게 이해하기
Primary Key는 뭐예요?
"나만의 특별한 번호"
•
우리 반에 김민수가 2명 있어도, 학번은 다르죠?
•
101번은 세상에 단 하나뿐!
Foreign Key는 뭐예요?
"친구를 가리키는 화살표"
•
급식 테이블에서 "101번이 급식 먹었어요"라고 할 때
•
그 101번이 누군지는 학생 테이블을 보면 알 수 있어요!
왜 이렇게 나누나요?
만약 모든 정보를 한 테이블에 넣으면...
•
김민수가 책을 5권 빌리면, 이름을 5번 써야 해요 
•
이름이 바뀌면 5군데를 다 고쳐야 해요 
하지만 테이블을 나누면...
•
학번만 쓰면 돼요! 
•
이름은 한 곳에서만 관리해요! 
다시 더 쉽게
우리가 만든 초등학교 데이터베이스 자세히 이해하기
나무의 줄기와 가지를 만드는 마법 주문!
줄기 테이블 (학생) 만들기
CREATE TABLE 학생 (
학번 INT PRIMARY KEY,
이름 VARCHAR(20),
학년 INT,
반 INT
);
SQL
복사
이 코드를 친구에게 설명한다면?
"학생 명단 공책을 만드는 거야!"
1.
CREATE TABLE 학생
•
"학생이라는 이름의 빈 공책을 새로 만들어!"
•
마치 문방구에서 새 공책을 사는 것처럼!
2.
학번 INT PRIMARY KEY
•
학번 = "첫 번째 칸 이름은 '학번'이야"
•
INT = "여기엔 숫자만 쓸 거야" (Integer = 정수)
•
PRIMARY KEY = "
이건 아주 특별한 칸이야!"
왜 특별해요?
•
우리 반에 김민수가 2명 있어도 학번은 다르잖아요?
•
101번은 이 세상에 단 한 명뿐!
•
이게 바로 나무의 줄기가 되는 이유예요!
3.
이름 VARCHAR(20)
•
이름 = "두 번째 칸은 '이름'이야"
•
VARCHAR(20) = "글자를 쓸 건데, 최대 20글자까지만!"
•
Variable Character = 변하는 글자 (김민수는 3글자, 남궁민수는 4글자)
4.
학년 INT, 반 INT
•
"학년이랑 반도 숫자로 쓸 거야"
•
3학년 2반 → 학년: 3, 반: 2
첫 번째 가지 테이블 (급식) 만들기
CREATE TABLE 급식 (
번호 INT PRIMARY KEY,
학번 INT,
날짜 DATE,
먹었나요 VARCHAR(5),
FOREIGN KEY (학번) REFERENCES 학생(학번)
);
SQL
복사
이 코드를 친구에게 설명한다면?
"급식 먹은 기록 공책을 만들고, 학생 공책과 연결하는 거야!"
1.
번호 INT PRIMARY KEY
•
"급식 기록마다 번호를 매길 거야"
•
1번 기록, 2번 기록, 3번 기록...
2.
학번 INT
•
"누가 먹었는지 학번을 적을 거야"
•
근데 이름을 안 쓰고 학번만 쓰는 이유는?
•
3.
날짜 DATE
•
"언제 먹었는지 날짜를 적어"
•
DATE = 2024-03-04 같은 날짜 형식
4.
먹었나요 VARCHAR(5)
•
"먹었는지 안 먹었는지 적어"
•
'예' 또는 '아니오'
5.
•
이게 바로 가지와 줄기를 연결하는 마법이에요!
•
FOREIGN KEY (학번) = "우리 급식 표의 '학번'은..."
•
REFERENCES 학생(학번) = "학생 표의 '학번'을 가리켜!"
쉽게 말하면:
•
"101번이 급식 먹었어" → "101번이 누구지?" → "학생 표 보니까 김민수네!"
•
급식 표는 학생 표 없이는 의미가 없어요 (가지는 줄기가 있어야 존재!)
두 번째 가지 테이블 (도서대출) 만들기
CREATE TABLE 도서대출 (
대출번호 INT PRIMARY KEY,
학번 INT,
책이름 VARCHAR(50),
빌린날짜 DATE,
FOREIGN KEY (학번) REFERENCES 학생(학번)
);
SQL
복사
이 코드를 친구에게 설명한다면?
"도서관 대출 기록 공책을 만들고, 이것도 학생 공책과 연결하는 거야!"
1.
대출번호 INT PRIMARY KEY
•
"대출할 때마다 번호표를 주는 거야"
•
도서관에서 책 빌릴 때 받는 영수증 번호 같은 거!
2.
학번 INT
•
"누가 빌렸는지 학번만 적어"
•
또 이름 안 쓰고 학번만! (학생 표에 이름 있으니까)
3.
책이름 VARCHAR(50)
•
"무슨 책인지 이름을 적어"
•
책 이름은 좀 길 수도 있으니까 50글자까지!
4.
빌린날짜 DATE
•
"언제 빌렸는지 날짜 기록"
5.
•
또 나온 연결 마법!
•
"이 대출 기록의 학번은 학생 표의 학번을 보고 있어!"
왜 이렇게 나누어서 연결하나요?
나쁜 예시 - 모든 걸 한 표에 넣으면? 
| 이름 | 학년 | 반 | 급식날짜 | 먹었나요 | 책이름 | 빌린날짜 |
|------|------|-----|---------|----------|--------|----------|
| 김민수 | 3 | 2 | 3/4 | 예 | 해리포터 | 3/1 |
| 김민수 | 3 | 2 | 3/5 | 예 | 신데렐라 | 3/4 |
Plain Text
복사
문제점:
•
김민수 정보를 계속 반복해서 써야 해요 
•
김민수가 4학년이 되면? 모든 줄을 다 고쳐야 해요! 
좋은 예시 - 줄기와 가지로 나누면? 
줄기 (학생 표):
| 학번 | 이름 | 학년 | 반 |
|------|------|------|-----|
| 101 | 김민수 | 3 | 2 |
Plain Text
복사
가지 (급식 표):
| 번호 | 학번 | 날짜 | 먹었나요 |
|------|------|------|----------|
| 1 | 101 | 3/4 | 예 |
| 2 | 101 | 3/5 | 예 |
Plain Text
복사
가지 (도서대출 표):
| 대출번호 | 학번 | 책이름 | 빌린날짜 |
|----------|------|--------|----------|
| 1 | 101 | 해리포터 | 3/1 |
| 2 | 101 | 신데렐라 | 3/4 |
Plain Text
복사
장점:
•
이름은 한 번만 쓰면 돼요! 
•
4학년 되면? 학생 표에서 한 곳만 고치면 끝! 
•
학번(101)이 줄기와 가지를 연결해줘요! 
정리: 줄기와 가지의 비밀
줄기 테이블 (PRIMARY KEY)
•
학생 테이블이 줄기예요
•
학번이 각 학생의 특별한 이름표 (PRIMARY KEY)
•
모든 가지들이 이 줄기에서 시작해요
가지 테이블 (FOREIGN KEY)
•
급식, 도서대출 테이블이 가지예요
•
각자 고유 번호(PRIMARY KEY)도 있지만...
•
*학번(FOREIGN KEY)**으로 줄기와 연결돼요!
그림으로 보면:
[학생] ← 줄기 (학번이 PRIMARY KEY)
|
| 학번으로 연결 (FOREIGN KEY)
|
-------+-------
| |
[급식] [도서대출] ← 가지들
Plain Text
복사
마법의 주문 FOREIGN KEY:
•
"내 표의 이 학번은, 학생 표의 학번을 보고 있어!"
•
이 주문 덕분에 "101번이 누구지?" 물으면 바로 답할 수 있어요!
이제 여러분도 줄기와 가지를 만들어서 연결할 수 있어요! 