📌 비정규화된 테이블 문제점
ID | name | class | race | level | inventory
--------------------------------------------------------
1001 | rookiss | 마법사 | 휴먼 | 32 | 지팡이, 양초 * 2, 초록 물약 * 10
1005 | faker | 전사 | 엘프 | 14 | 단검, 방패, 양초 * 4
📌 "각 칸에는 하나의 값만 저장"
ID | name | class | race | level | itemCode | itemName | itemCount
-----------------------------------------------------------------------------
1001 | rookiss | 마법사 | 휴먼 | 32 | 13 | 지팡이 | 1
1001 | rookiss | 마법사 | 휴먼 | 32 | 14 | 양초 | 2
1001 | rookiss | 마법사 | 휴먼 | 32 | 15 | 초록 물약 | 10
1005 | faker | 전사 | 엘프 | 14 | 21 | 단검 | 1
1005 | faker | 전사 | 엘프 | 14 | 25 | 방패 | 1
1005 | faker | 전사 | 엘프 | 14 | 14 | 양초 | 4
📌 "중복 데이터 제거 + 부분적 종속성 제거"
📌 "기본 키(Primary Key)가 유일해야 한다"
📌 players (플레이어 정보 저장)
ID | name | class | race | level
-----------------------------------------
1001 | rookiss | 마법사 | 휴먼 | 32
1005 | faker | 전사 | 엘프 | 14
📌 inventory (플레이어의 아이템 저장)
playerID | itemCode | itemCount
-------------------------------
1001 | 13 | 1
1001 | 14 | 2
1001 | 15 | 10
1005 | 21 | 1
1005 | 25 | 1
1005 | 14 | 4
playerID로 관계 연결📌 "아이템 코드와 아이템 이름 분리"
📌 "의미상 분리 가능한 데이터는 별도 테이블로 분리"
📌 itemInfo (아이템 정보 저장)
itemCode | itemName
-------------------
13 | 지팡이
14 | 양초
15 | 초록 물약
21 | 단검
25 | 방패
📌 players (플레이어 정보)
ID | name | class | race | level
-----------------------------------------
1001 | rookiss | 마법사 | 휴먼 | 32
1005 | faker | 전사 | 엘프 | 14
📌 inventory (플레이어의 아이템 저장)
playerID | itemCode | itemCount
-------------------------------
1001 | 13 | 1
1001 | 14 | 2
1001 | 15 | 10
1005 | 21 | 1
1005 | 25 | 1
1005 | 14 | 4
📌 itemInfo (아이템 코드별 정보)
itemCode | itemName
-------------------
13 | 지팡이
14 | 양초
15 | 초록 물약
21 | 단검
25 | 방패
inventory 테이블에서 itemCode만 저장하면 itemInfo를 참조하여 아이템 이름을 불러올 수 있음itemInfo 테이블만 수정하면 됨)-- [플레이어 정보 테이블]
CREATE TABLE players (
ID INTEGER PRIMARY KEY,
name VARCHAR(20) NOT NULL,
class VARCHAR(10) NOT NULL,
race VARCHAR(10) NOT NULL,
level INTEGER NOT NULL
);
-- [아이템 정보 테이블]
CREATE TABLE itemInfo (
itemCode INTEGER PRIMARY KEY,
itemName VARCHAR(20) NOT NULL
);
-- [인벤토리 테이블]
CREATE TABLE inventory (
playerID INTEGER,
itemCode INTEGER,
itemCount INTEGER NOT NULL,
PRIMARY KEY (playerID, itemCode),
FOREIGN KEY (playerID) REFERENCES players(ID),
FOREIGN KEY (itemCode) REFERENCES itemInfo(itemCode)
);
SELECT p.ID, p.name, p.class, p.race, p.level, i.itemName, inv.itemCount
FROM inventory inv
JOIN players p ON inv.playerID = p.ID
JOIN itemInfo i ON inv.itemCode = i.itemCode
ORDER BY p.ID;
결과 예시
ID | name | class | race | level | itemName | itemCount ----------------------------------------------------------------- 1001 | rookiss | 마법사 | 휴먼 | 32 | 지팡이 | 1 1001 | rookiss | 마법사 | 휴먼 | 32 | 양초 | 2 1001 | rookiss | 마법사 | 휴먼 | 32 | 초록 물약 | 10 1005 | faker | 전사 | 엘프 | 14 | 단검 | 1 1005 | faker | 전사 | 엘프 | 14 | 방패 | 1 1005 | faker | 전사 | 엘프 | 14 | 양초 | 4