๐ ์ 1-2-3 ์ ๊ทํ & ์ญ์ ๊ทํ ๊ธฐ๋ฒ ๐ฏ ์ ๋ฆฌ
์ ๊ทํ๋?
ERD๋ด์์ ์ค๋ณต์์๋ฅผ ์ฐพ์ ์ ๊ฑฐํด ๋๊ฐ๋ ๊ณผ์
- ์ค๋ณต๋ ๋ฐ์ดํฐ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
โ
3์ฐจ ์ ๊ทํ ์ ๋๋ง ์๋ฉด ์ค๊ณํ๋๋ฐ ๋ฌด๋ฆฌ๊ฐ ์๋ค.
- ์ค๋ณต์ ์ต์ํ -> ์์ ํ ์์ ๋๊ฒ ์๋๋ผ ์ด๋์ ๋๋ ์ธ์ ํ๊ฒ ๋ค
- ์๊ฐ์ ์ค์ด๊ธฐ ์ํด (๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ 1์ต๊ฐ์ ํํ์ด ๋ค์ด์๋ค๊ณ ์๊ฐํด๋ด๋ผ)
โ
๋ช๊ฐ์ง ์์น๋ง ์งํค๋ฉด ์ ๊ทํ๊ฐ ํ์ ์๋ ERD๋ฅผ ์ค๊ณํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทํ ์ ์ฐจ
โํจ์ ์ข ์์ฑ์ ์ด์ฉํด ๋ฆด๋ ์ด์ ์ ์ฐ๊ด์ฑ์ด ์๋ ์์ฑ๋ค๋ก๋ง ๊ตฌ์ฑ๋ ๋๋ก ๋ถํดํด์ ์ด์ํ์์ด ๋ฐ์ํ์ง ์๋๋ก Step By Step Approach ๋ก ์ํ
๊ธฐ๋ณธ ์ ๊ทํ์ผ๋ก๋ ์ 1โง2โง3โง๋ณด์ด์ค/์ฝ๋ ์ ๊ทํ์ด ์์ผ๋ฉฐ, ์ 4โง5 ์ ๊ทํ ์ ๊ณ ๊ธ ์ ๊ทํ์ผ๋ก ๋ถ๋ฅ
โ
์ 1 ์ ๊ทํ
-> ์ 1์ฐจ ์ ๊ทํ๋ ๊ฐ์ ์ฑ๊ฒฉ๊ณผ ๋ด์ฉ์ ์ปฌ๋ผ์ด ์ฐ์์ ์ผ๋ก ๋ํ๋๋ ์ปฌ๋ผ์ด ์กด์ฌํ ๋, ํด๋น ์ปฌ๋ผ์ ์ ๊ฑฐํ๊ณ ๊ธฐ๋ณธํ ์ด๋ธ์ PK๋ฅผ ์ถ๊ฐํด ์๋ก์ด ํ ์ด๋ธ์ ์์ฑํ๊ณ , ๊ธฐ์กด์ ํ ์ด๋ธ๊ณผ 1:N ๊ด๊ณ๋ฅผ ํ์ฑํ๋ ๊ฒ์ด๋ค.
tagํ๋๋ฅผ ๋ณด๋ฉด, ๊ฐ๋ค์ด ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค. ํ๋์ ํ๋์ ๊ฐ๋ค์ด ์ฌ๋ฌ๊ฐ ์์ผ๋ฉด ์๋๋ค.
์ด๋ฅผ ์ ๊ทํ ์ํค๋ณด์.
1. ์ฐ์ ํ๋์ title์ ์ฌ๋ฌ๊ฐ์ tag๋ฅผ ๊ฐ๋๋ค. ๋ํ ํ๋์ tag(rdb)๋ ์ฌ๋ฌ๊ฐ์ title(mySQL, Oracle)์ ๊ฐ๋๋ค.
2. ๊ทธ๋ฌ๋ฉด title๊ณผ tag๋ฅผ ํ ์ด๋ธ ๋๊ฐ๋ก ๋ถ๋ฆฌํ์๋ ์ด๋ค์ ๊ด๊ณ๋ M:N์ด ๋๋ค.
3. M:N์ ํํํ๊ธฐ ์ํด์ ํ ์ด๋ธ 3๊ฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
4. title๊ณผ topicํ ์ด๋ธ์ ๋ถ๋จ์ํค๊ณ ๊ทธ ์ค๊ฐ๊ฒฝ๋ก ํ ์ด๋ธ์ธ topic_tag_relation์ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํ ์ด๋ธ์ ์ด์ด์ธ ์๋ก์ด ํ๊ทธ tag_id์์ฑ์ ๋ง๋ ๋ค.
5. ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ 1:N ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ฉด ์ ๊ทํ๊ฐ ์๋ฃํ ๊ฒ์ด๋ค.
โ
์ 2์ ๊ทํ
-> ์ 2์ ๊ทํ๋ PK๊ฐ ์ฌ๋ฌ ํค๋ก ๊ตฌ์ฑ๋ ๋ณตํฉํค(Composite Primary Key)๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ๊ฐ 2์ฐจ ์ ๊ทํ์ ๋์์ด ๋๋ฉฐ, ๋ณตํฉํค ์ ์ฒด์ ์์กดํ์ง ์๊ณ ๋ณตํฉํค์ ์ผ๋ถ๋ถ์๋ง ์ข ์๋๋ ์์ฑ๋ค์ด ์กด์ฌํ ๊ฒฝ์ฐ (์ฆ, ๋ถ๋ถ์ ํจ์ ์ข ์ ๊ด๊ณ) ์ด๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
1. ์ 1์ ๊ทํ๋ฅผ ๋ง์น ํ ์ด๋ธ์ ๋ณด๋ฉด, ์ค๋ณต๋๋ ๋ ์ฝ๋(์ ๊ฐ์)๊ฐ ๋ณด์ธ๋ค.
2. ์ ๋ถ๋ถ์ด ์ค๋ณต๋์ด ๋ํ๋๋ ์ด์ ๋ type์ price ํ๋ ๊ฐ์ด ๊ฐ๊ธฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
3. ๊ทธ๋ฌ๋ฉด ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ถ์ ํ ์ด๋ธ๋ก ๋๋๊ณ ์ค๋ณต๋ถ๋ถ์ ํ๋๋ก ํํ๋๊ฒ ํด๋ณด์.
4. ๋จผ์ ์ค๋ณต์ด ๋ํ๋๊ฒ ํ ์์ธ ํ๋์ธ type์ price ํ๋๋ฅผ ๋ฐ๋ก ๋นผ์ topic_typeํ ์ด๋ธ์ ๋ง๋ ๋ค.
5. ๊ทธ๋ฆฌ๊ณ topic_type์์ ์๋ณํ ์์๋ ์ธ๋ํค title์ ๋ฑ๋กํด์ค๋ค.
6. ์ด๋ ๊ฒ ํ๋ฉด, ์ค๋ณต๋๋ ๊ฒ ์์ด title์ด mySQL์ด๋ ์๋๋์ ๋ฐ๋ผ topic ํ ์ด๋ธ์์ ์ ์์ ๋ณด, topic_typeํ ์ด๋ธ์์ ๊ฐ๊ฒฉ๊ณผ ํ์ ์ ๊ฐ๊ฐ ๋ํ๋ผ์์๊ฒ ๋๋ค.
์ 3์ ๊ทํ
-> ํ ์ด๋ธ์ ํค๊ฐ ์๋ ์ปฌ๋ผ๋ค์ ๊ธฐ๋ณธํค์ ์์กดํด์ผ ํ๋๋ฐ ๊ฒ์ผ๋ก๋ ๊ทธ๋ฐ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๊ธฐ๋ณธํค๊ฐ ์๋ ๋ค๋ฅธ ์ผ๋ฐ ์ปฌ๋ผ์ ์์กดํ๋ ์ปฌ๋ผ๋ค์ด ์์ ์ ์๋ค.
์ด๋ฅผ (์ด์ ์ ํจ์ ์ข ์ ๊ด๊ณ)๋ผ๊ณ ํ๋ค.
์ 3์ ๊ทํ๋ PK์ ์์กดํ์ง ์๊ณ ์ผ๋ฐ์ปฌ๋ผ์ ์์กดํ๋ ์ปฌ๋ผ๋ค์ ๋ถ๋ฆฌํ๋ค.
1. ์ 2์ ๊ทํ๋ฅผ ๋ง์ณค์ง๋ง ์ฌ์ ํ ์ค๋ณต๋ ๊ฐ(๋ ธ๋์) ์ด ๋ณด์ธ๋ค.
2. ์ ๋ ์ฝ๋๋ author_id์ ์์กดํ๋ ์ปฌ๋ผ๋ค์ด๋ค. ์ธ๋ป๋ณด๋ฉด title์ ์์กดํ๋๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์๋๊ฒ์ด๋ค.
3. ๊ทธ๋ผ PK(title)์ ์์กดํ์ง ์๋ ์ปฌ๋ผ๋ค์ ๋ถ๋จ์ํค์.
4. author๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์ค๋ณต๋๋ ์ปฌ๋ผ๋ค 3๊ฐ๋ฅผ ๊ทธ๋๋ก ๋ฐ์จ๋ค. ๊ทธ๋ฆฌ๊ณ topicํ ์ด๋ธ๊ณผ author_id๋ก ์ธ๋ํค ๊ด๊ณ๋ฅผ ๋งบ์ด์ค๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ณต์ด ์ฌ๋ผ์ง๋๊ฒ์ ๋ณผ ์ ์๋ค.
โ
Q. ๊ทธ๋ฐ๋ฐ ๋ง์ผ author_id๊ฐ ์๊ณ author<name, author_profile๋ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๊ทธ๋๋ ์ฌ์ ํ ์ค๋ณต์ ๋ํ๋ธ๋ค.
์ด๋ ์ ์ค๋ณต๋ ์ปฌ๋ผ๋ค์ ๋ฐ๋ก ๋นผ๊ณ , PK๋ฅผ ์ธ๋ํค๋ก ๊ฐ์ ธ์ค๊ฑฐ๋ ์๋๋ฉด ๊ตฌ๋ถํ ์์๋ ์๋ก์ด ์ปฌ๋ผ์ ๋ง๋ค์ด์ ์์๊ฐ์ด ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ๋ ๋์์ง ์๋ค.
๊ฒฐ๊ตญ, ์ ๊ทํ ๊ณผ์ ์ด๋
์ค๋ณต๋ ์์ฑ์ ์ต์ํ ํ๊ณ ์ข ์๊ด๊ณ์ ์๋ ์์ฑ์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ด๋ค.
์ด๋ฌํ ์ ๊ทํ ๊ณผ์ ์ ๋ค์ ์กฐ์ธํ๋ฉด ๋ฐ์ดํฐ์ ์์ค์์ด ์ด์ ์ํ๋ก ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค.โ
์ญ์ ๊ทํ
โ-> ๋ ผ๋ฆฌ์ ์ ๊ทํ๋ฅผ ํตํด ๋ง๋ ํ๋ฅผ, ๊ฐ๋ฐ์ ์ธก๋ฉด์์ ์ฑ๋ฅ์ด๋ ํธ์์ฑ์ ์ํด์ ๋๋์๊ฐ๋ ์์ ์ ์ผ์ปซ๋๋ค.
๊ทธ๋ ๋ค๊ณ ์ ๊ทํ๋ฅผ ํ๋ค๊ณ ํด์ ๋ฐ๋์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐํ ํ์ง๋ ๋ง์.
โ
๋ค์๊ณผ ๊ฐ์ ์ ๊ทํ๋ฅผ ๋ง์น ๋ ผ๋ฆฌ์ ํ ์ด๋ธ๋ค์ด ์๋ค๊ณ ํ์.
[ ์๋ณธ ํ ์ด๋ธ ]
์ญ์ ๊ทํ - JOIN์ ์ค์ด๊ธฐ
1. ๋ง์ผ topic_tag_relation์ topic_titleํ๋๋ฅผ ๊ฐ์ง๊ณ tagName์ ์์์ผ๋๋ค๊ณ ํด๋ณด์.
2. ๊ทธ๋ฌ๋ฉด topic_tag_relation๊ณผ tagํ ์ด๋ธ์ ์กฐ์ธํด์ ์กฐ๊ฑด์ ๋ถํฉํ๋ name์ปฌ๋ผ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
3. ํ์ง๋ง ๋ง์ผ ์ ๋ฌํ ์ฟผ๋ฆฌ๊ฐ ์๋ฒ๋ด์์ ๋ง์ด ์ผ์ด๋ ๊ฒฝ์ฐ, join์ ๋ง์ ๋ถํ๊ฐ ์ผ์ด๋๊ธธ ๋ง๋ จ์ด๋ค.
4. ์ด๋ ๊ทธ๋ฅ ํ ์ด๋ธ์ ํ๋๋ก ํฉ์ณ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
5. ์ 1์ ๊ทํ๋ฅผ ํตํด ๋๋ด๋ ๊ฑธ ์ฑ๋ฅ๊ณผ ํธ์๋ฅผ ์ํด์ ์ญ์ผ๋ก ๋๋์๊ฐ๋ฒ๋ฆฐ ๊ฒ์ด๋ค.
์ญ์ ๊ทํ - ๊ณ์ฐ ์์ ์ ์ค์ด๊ธฐ
์ด๋ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋น์ฉ์ ์ค์ด๊ธฐ ์ํ ์ญ์ ๊ทํ ์ด๋ค.
1. ๋ง์ผ count ๊ฐ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ์. group by๋ฅผ ํตํด ์ปฌ๋ผ์ ๋ฌถ๊ณ ์กฐํํ๋ฉด ๋๋ค.
2. ํ์ง๋ง ๋ง์ผ ์ด๋ฌํ ์ฟผ๋ฆฌ๊ฐ ๋น๋ฒํ๊ฒ ์ด๋ฌ๋๋ค๋ฉด ์ญ์ ๋ถํ๊ฐ ์ผ์ด๋๋ค.
3. ๋ฐ๋ผ์ ๊ทธ๋ฃนํํด์ ๋ด์ฅํจ์๋ฅผ ์ฐ๋๊ฒ ์๋ ์์ topic_count๋ฐ์ดํฐ๋ฅผ ์ปฌ๋ผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. topic_count ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ค๋ค.
4. ํ์ง๋ง ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด์๋ ๊ธ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ด๋ฆฌ๋ฅผ ํด์ผ ํ๋ค.
5. ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฐ๋์ง ์๋ฒ ์ฌ์ด๋์์ ์ฒ๋ฆฌํ๋์ง ํ๋ฉด ๋๋ค.
6. ๊ด๊ฑด์ group by ๋ถํ๋ฅผ ์ค์ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ญ์ ๊ทํ - ํ ์ด๋ธ ๋ถ๋ฆฌ
ํ๋์ ํ๋ฅผ ์ฑ๋ฅ์ ์ํด์ ์ฌ๋ฌ๊ฐ๋ก ์ชผ๊ฐ๋ ๊ฒฝ์ฐ์ด๋ค.
๋ง์ผ topicํ ์ด๋ธ์ description์ ์ฉ๋์ด ์์ฒญ๋ง์๋ ๋ง์ผ topicํ ์ด๋ธ์ ์์ฃผ ์กฐํํ์ ๊ฒฝ์ฐ ์ฝ๊ฐ ๋ถํ๊ฐ ์ฌ์๋ ์๋ค.
๊ทธ๋์ ํ์ ์ฑ๋ฅ์ ์ํด ์ฉ๋์ด ํฐ ํ ์ด๋ธ์ ๋ฐ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
ํ ์ด๋ธ์ ๋๋๋ฉด ์ฌ๋ฌ๋์ ์๋ฒ์์ ๊ฐ๊ธฐ ๋ค๋ฅด๊ฒ ์ ๊ทผํด์ ์ฒ๋ฆฌํ ์ ์์ผ๋ ์ฑ๋ฅ์ด ์ข๋ค.
โ
ํ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ๋๊ฒ์ ๋ง์ผ author_id ํ์์ด ๋ช๋ง๋ช ์ผ๋, ํ๋์ ํ ์ด๋ธ์ ์ ๊ทผํด์ ์ฒ๋ฆฌํ๋๊ฒ๋ณด๋ค, ํ ์ด๋ธ์ ๋ถ๋ดํด์ author_id๊ฐ 1000์ดํ์ผ ๊ฒฝ์ฐ 1500์ด์์ผ ๊ฒฝ์ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ์ ๊ทผํด์ ๋ถํ๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค.
mySQL์๋ ํํฐ์ ๊ธฐ๋ฒ์ด ์๋๋ฐ, ๋ฐ๋ก ์ด๊ฑธ ๋งํ๋ ๊ฒ์ด๋ค.
์ญ์ ๊ทํ - ์ธ๋ํค ์ค์ด๊ธฐ
join์ ์ค์ฌ์ ์ง๋ฆ๊ธธ์ ๋ง๋๋ ํ ํฌ๋์ด๋ค. ์ฒ์์ ๋ฐฐ์ ๋ ์ญ์ ๊ทํ - JOIN์ ์ค์ด๊ธฐ ๋ฐฉ๋ฒ์์ ์ธ๋ํค๋ฅผ ํตํด์ ์ค์ด๋ ๋ฐฉ๋ฒ์ด๋ผ ๋ณด๋ฉด ๋๋ค.
โ
์ด๋ ์ ์์ ํ๊ทธ์์ด๋์ ํ๊ทธ๋ช ์ ์กฐํํ๋ค๊ณ ๊ฐ์ ํ์๋, ์ฐ๋ฆฌ๋ ์ธ๊ฐ์ง ํ๋ ์ด๋ ์ ์์ธ์ง(autor_id), tag_id, tagName ์ด ํ์ํ๋ค ์ด๋ค์ ์กฐํ ํ๊ธฐ ์ํด์ 3๊ฐ์ ํ ์ด๋ธ์ joinํ๊ณ ๋ถ๋ฌ์ค๋ฉด ๋์ง๋ง, join์ ๋ง์ด ์ฐ๋ฉด ์ฑ๋ฅ์ด ์์ข์์ง๋ค. ๊ทธ๋์ topic_tag_relationํ ์ด๋ธ์ author_id์ปฌ๋ผ์ ์ถ๊ฐํ๋ฉด, join์ ํ๋ฒ๋ง ํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://myeonguni.tistory.com/210
https://www.opentutorials.org/course/3883/25301