ํ๋ถ ๋ ๊ณต๋ถํ๊ธด ํ์ง๋ง ํ์ ์์ ์๊ฐ๋ณด๋ค ERD๋ฅผ ์ ํ ์ผ์ด ๋ง์ด(?) ๋ฐ์ํ๋ค
- ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ฐฐํฌ๋์ด ํ ์ด๋ธ์ด ์๋ก ๋ง๋ค์ด์ก์ ๋
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ ๋
๊ทธ๋๋ง๋ค ๋น ๋ฅด๊ฒ ์ดํดํ๊ณ ์ถ์ด ๋ค์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
(๋ง์ฝ ๋ด๊ฐ ์ฌ๋ฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์
์ ์
์ฌํ๊ฒ ๋๋ค๋ฉด(ex. ์นด์นด์ค) ERD๋ฅผ ๋ณด๊ณ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์
ํ ํ์์ฑ์ด ์๊ธธ ๊ฒ ๊ฐ๋ค.)
+ ์ฝํ
๋ฌธ์ ํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ
์ด๋ธ ์ ์๋ฅผ ๋ช
์ํด์ฃผ๋ ๊ณณ์ด ์์์ด์ ์์๋๋ฉด 200% ๋์๋จ!!
1. ํ ์ด๋ธ ๊ด๊ณ
ERD(entity relationship diagram)๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅ / ๊ฐ์ฒด๋ค ๊ด๊ณ๋ฅผ ๋ณด๊ธฐ์ํ ์ง๋
- entity : ๊ฐ์ฒด (์ฆ ํ ์ด๋ธ์ ์๋ฏธ)
- attribute : ์ปฌ๋ผ ์ ๋ณด๋ฅผ ์๋ฏธ (์ปฌ๋ผ ์ด๋ฆ, ๋ฐ์ดํฐ์ ํ์
)
- PK(primary key) : ๊ธฐ๋ณธํค, ์ฃผ์๋ณ์
- ํ ์ด๋ธ์ ๋ํํ๋ ํค์ด๊ธฐ ๋๋ฌธ์ ํ ์ํฐํฐ ์์ PK๋ ํ๋
- FK(foreign key) : ์ธ๋ํค, ์ธ๋ถ ์๋ณ์
- ๋๊ฐ์ง ์ํฐํฐ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ
- PK(primary key) : ๊ธฐ๋ณธํค, ์ฃผ์๋ณ์
- ๊ด๊ณ (ํ์ดํ๋ก ํํ)
- ํ ์ํฐํฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ํฐํฐ์ ์ฐ๊ฒฐ๋์ด์๋์ง ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค
- ๋์ค๋ก ๊ทธ์ด์ ์๋๊ฒ one
- ์ผ๋ฐ์ด๊ฐ many๋ฅผ ์๋ฏธ
- ํ ์ํฐํฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ํฐํฐ์ ์ฐ๊ฒฐ๋์ด์๋์ง ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค
[์ฐธ๊ณ ]
์์๋๋ฉด ์ธ๋ฐ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (3) ER ๋ชจ๋ธ์ ๊ตฌ์ฑ ์์ - ์ํฐํฐ, ์์ฑ, ๊ด๊ณ
ERD์์ ๊ด๊ณ ํ๊ธฐ(Crow’s foot)๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์ ๋ค๋ฉด ์ด ๊ธ์ ์๋ ๊ฟํ์ ์ฐธ๊ณ ํด๋ณด์ธ์.
datarian.io
2. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํค (key)
๋ฒ์ : ์ํผํค > ํ๋ณดํค > ๊ธฐ๋ณธํค
- ์ํผํค
- ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ์์ฑ์ ์งํฉ
- ์ฃผ๋ฌธ๋ฒํธ/์ฃผ๋ฌธ๋ ์ง/ํ์๋ฒํธ
- ๊ฐ๋ฅํ ๋ชจ๋ ์์ฑ ์งํฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ๊ฒฝ์ฐ (๊ฐ์ฅ ํฐ ๋ฒ์)
- ํ๋ณดํค
- ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ "์ต์ํ์" ์์ฑ ์งํฉ
- ์ํผํค์ ์ผ๋ณด๊ฐ ํ๋ณดํค๊ฐ ๋จ (์ฃผ๋ฌธ๋ฒํธ ํ๋๋ง์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ์ ์์)
- ๊ธฐ๋ณธํค(PK, ํผํค)
- ํ๋ณดํค ์ค์ ํ๋์ ๊ธฐ๋ณธํค๋ฅผ ์ ํ
- ๋ณตํฉ ๊ธฐ๋ณธํค : ๋๊ฐ์ ์ปฌ๋ผ ์กฐํฉ์ด ๊ธฐ๋ณธํค๊ฐ ๋๋ ๊ฒฝ์ฐ (ex. ์ฃผ๋ฌธ ํ๋์ ์ฌ๋ฌ ์ํ์ ์ฃผ๋ฌธํ ๊ฒฝ์ฐ)
- ์ฃผ๋ฌธ๋ฒํธ x ์ํ์ฝ๋ ์กฐํฉ์ด ๊ธฐ๋ณธํค๊ฐ ๋๋ค. (๋จ, ์ค๋ฌด์์๋ ์ฃผ๋ฌธ ์์ธ ID๋ฅผ ๊ธฐ๋ณธํค๋ก ๋นผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ค์)
- ๊ฐ์ ๋ณ๋์ด ์ ์ ๊ฒ์ ์ ํํ๋ ๊ฒ์ด ์ผ๋ฐ์ (ex. ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๋ ๊ฐ์ธ์ ํน์ ํ ์ ์์ง๋ง ๋ณ๊ฒฝ ์ ์ฒญ์ํด์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค, ๊ธฐ๋ณธํค๋ก ์ ํ์ด ์ด๋ ต๋ค)
- ํ ์ด๋ธ์ ๋ง๋ค ๋ ์ ์ํด์ค์ผํจ(์ค์ฒด๊ฐ ์์)
- ํ๋ณดํค ์ค์ ํ๋์ ๊ธฐ๋ณธํค๋ฅผ ์ ํ
CREATE TABLE People (
ID INT NOT NULL,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Age INT,
PRIMARY KEY(ID) --ID๋ฅผ ๊ธฐ๋ณธ ํค๋ก ์ค์
);
- ๋์ฒดํค
- ํ๋ณดํค ์ค ๊ธฐ๋ณธํค๊ฐ ๋์ง ์์ ํค
- ์ธ๋ํค(FK)
- ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉ
์์ฑ ์งํฉ | ์ํผํค ์ฌ๋ถ | ํ๋ณดํค ์ฌ๋ถ |
์ฃผ๋ฌธ ๋ฒํธ | O | O |
์ฃผ๋ฌธ ๋ ์ง | X | X |
ํ์ ๋ฒํธ | X | X |
(์ฃผ๋ฌธ ๋ฒํธ, ์ฃผ๋ฌธ ๋ ์ง) | O | X |
(์ฃผ๋ฌธ ๋ฒํธ, ํ์ ๋ฒํธ) | O | X |
(์ฃผ๋ฌธ ๋ ์ง, ํ์ ๋ฒํธ) | X | X |
(์ฃผ๋ฌธ ๋ฒํธ, ์ฃผ๋ฌธ ๋ ์ง, ํ์ ๋ฒํธ) | O | X |
ใด ์ฃผ๋ฌธ ๋ฒํธ๊ฐ ์ํผํค์ด๊ธฐ ๋๋ฌธ์ ์ฃผ๋ฌธ ๋ฒํธ๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ํผํค
3. attribute ์ ๋ฐ์ดํฐ ํ์
- ์ซ์
- ์ ์ : tinyint() < smallint() < mediumint() < int() < bigint()
- ๋ค์ด๊ฐ ์ ์๋ ์ ์์ ๋ฒ์์ ์ฐจ์ด๊ฐ ์์
- ์ค์ : demical() < double() < float()
- ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ์๋ก ๋ ์ ๋ฐํ์ง๋ง ์๋๊ฐ ๋น ๋ฆ
- ์ ์ : tinyint() < smallint() < mediumint() < int() < bigint()
- ๋ฌธ์ : varchar() -> various character์ ์ฝ์ / char()
- char()๊ฐ์ ๊ฒฝ์ฐ๋ ๊ธ์์๊ฐ ์ผ์ ํ ๋ฌธ์
- ๋ ์ง, ์๊ฐ
- date() : ๋ ์ง๋ง ์กด์ฌ, 1000-01-01 ~ 9999-12-31
- datetime() : ๋ ์ง+์๊ฐ๊น์ง ์กด์ฌ, 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999
- timestamp() : kst/utc.. ๋ฑ๋ฑ, datetime() + timezone
- ๋ ์ง๊ฐ varchar()๋ก ๋์ด์๋ ๊ฒฝ์ฐ(12/8/1968) ๋ ์งํ์ด ์๋๋ผ ํ ์คํธ ํ์ ์ผ๋ก ์ ์๋์ด ์๋ ๊ฒ์
- ํด๋น ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ๋ ์ง ์ฐ์ฐ์ด ํ์ํ๋ค๋ฉด ํ๋ณํ ํจ์๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค!
4. ํ ์ด๋ธ ์ ์ ์ฝ๊ธฐ
์ฝํ ๋ฌธ์ ์์ ์ด๋ ๊ฒ ํ ์ด๋ธ ์ ์๋ฅผ ๋ช ์ํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
studentsActivities ํ
์ด๋ธ์ PK(studentId, activity) / FK(studentId)
-> studentId, activity ์กฐํฉ์ด ๊ธฐ๋ณธํค
-> ๊ทธ ์ค studentId๋ studentsํ
์ด๋ธ์ ๊ธฐ๋ณธํค id๋ฅผ ์ฐธ์กฐ
[์ฐธ๊ณ ]
์์๋๋ฉด ์ธ๋ฐ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (4) ERD ์ฝ์ด๋ณด๊ธฐ
ERD๋ฅผ ์ด๋ป๊ฒ ์ฝ์ด์ผ ํ๋์ง ๋ชจ๋ฅธ๋ค๋ฉด, ์ด๋ฒ ๊ธ์์ ๊ทธ ๋ฐฉ๋ฒ์ ์ตํ๋ด ์๋ค.
datarian.io
์ด์ธ)
์์๋๋ฉด ์ธ๋ฐ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (2) ์ฌ๋ฌ ์ข ๋ฅ์ Key ์ดํดํ๊ธฐ (feat. PK, FK์ ์ ํํ ์๋ฏธ)
ERD์์ ์์ฃผ ๋ณธ PK, FK์ ์ ํํ ์๋ฏธ๋ฅผ ์์๋ด ์๋ค.
datarian.io
๋ฐ์ดํฐ๋ฆฌ์ SQL ๋ง์คํฐ๋ฐ ์ผ๋ฆฌ๋ฒ๋ ์ ์ฒญ์ ํ์๋๋ฐ (์ฟผ๋ฆฌ ์ฑ๋ฅ, ERD ์ฝ๊ธฐ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก)
ํผ์ ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋ค๋ณด๋ ์ ๊ฐ์๋ ๋ด ์ฐ์ฐจ์์๋ ์ค๋ฒ ์คํ์ด๋ผ๊ณ ๋๊ปด์ง๋ค.
ํ์ง๋ง ๊ผญ ํ๋ฒ ๋ค์ด๋ณด๊ณ ์ถ์ ๋ด์ฉ๋ค์ด๋ผ ๋ฆฌ์คํธ์๋ง ์ถ๊ฐํด๋ฌ์ผ์ง ์ถ์..~~