์ ๊ฐ ๋ณด๋ ค๊ณ ๋ง๋ค์์ต๋๋ค. ๊ณ์ ๋ด์ฉ์ด ์ถ๊ฐ๋ ์์ ์ ๋๋ค
# ์ ๊ทํ, ๋ฐ์ ๊ทํ
RDB์์ anomaly ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ ํ relation์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
`anomaly` -> ์ ๊ทํ๋ฅผ ๊ฑฐ์น์ง ์์์ ์๋ก ๋ค๋ฅธ ์ํฐํฐ๊ฐ ์ค๋ณต๋ ์ปฌ๋ผ ๊ฐ์ ๊ฐ๊ฒ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ฝ์ , ์ญ์ , ๊ฐฑ์ ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก NULL๊ฐ์ด ๋ค์ด๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฑฐ๋, ๊ฐฑ์ ๋ฌธ์ ๋ก ๋ชจ์์ด ์๊ธฐ๊ฑฐ๋, ์๋์ ์๊ด์๋ ๋ฐ์ดํฐ๊น์ง ์ญ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- 1 ์ ๊ทํ(First Normal Form - 1NF)
- ๋ชจ๋ ๋๋ฉ์ธ์ ์์๊ฐ์ผ๋ก๋ง ๊ฐ๊ณ ์๋ค(๋จ์ผ๊ฐ๋ง ๊ฐ๋ฅํ๊ณ ์ฌ๋ฌ๊ฐ์ ๊ฐ๋ ์ปฌ๋ผ์ด ์์ด์ผ๋๋ค)
- ์ปฌ๋ผ์ ๋ฐ๋ณต๋๋ ๊ทธ๋ฃน์ด ๋์ค์ง ์์์ผํ๋ค.
- ๊ธฐ๋ณธํค๋ฅผ ์ฌ์ฉํด์ ๊ฐ ํํ์ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์์ด์ผํ๋ค.
- 2 ์ ๊ทํ
- 1NF๋ฅผ ๋ง์กฑํ๋ ์ํฉ์์ ๋ถ๋ถ์ ํจ์ ์ข ์์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ๋ค.
- ํจ์์ ์ข
์์ ์์ ํจ์ ์ข
์, ๋ถ๋ถํจ์ ์ข
์์ผ๋ก ๋๋ ์ ์๋ค. ๊ธฐ๋ณธํค(PK)๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค. ๊ธฐ๋ณธํค๋ NULL์ด๋ฉด ์๋๊ณ ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง๋ฉด ์๋๋ค.
- ์์ ํจ์ ์ข ์ - `X -> Y`๋ก X๊ฐ์ ๋ฐ๋ผ Y๊ฐ์ด ๊ฒฐ์ ๋๋ ๊ฒฝ์ฐ. ๋ณตํฉํค์ฌ๋ ๊ฐ๋ฅํ๋ค.
- ๋ถ๋ถํจ์ ์ข ์ - ๋จ์ผํค๋ ๋ถ๊ฐ๋ฅํ๊ณ , ๋ณตํฉํค ์ค ํ๋๋ง์ผ๋ก๋ Y๊ฐ์ ๊ฒฐ์ ํ ์ ์๋ ๊ฒฝ์ฐ
- ์ดํ์ ํจ์์ข ์ - `X -> Y -> Z`๋ก Z๊น์ง ์์ ์๋ ๊ฒฝ์ฐ
- 3 ์ ๊ทํ
- ๊ธฐ๋ณธ ํค๊ฐ ์๋ ๋ชจ๋ ์์ฑ์ด ํค๋ณธํค์ ๋ํด ์ดํ์ ํจ์ ์ข ์ ๊ด๊ณ๋ฅผ ๋์ด๋ฒ๋ฆฌ๋ ๊ฒ
- ์์ฑ(์ปฌ๋ผ)์ด `X -> Y -> Z`๋ก ๊ฒฐ์ ๋๋ ๊ฑธ ๋์ด์ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค.
- BCNF(Boyce-Codd)
- ๋ชจ๋ ๊ฒฐ์ ์(`X->Y`์์์ X)๋ ํ๋ณดํค์ด์ผํ๋ค.
- ํ๋ณดํค, ๊ธฐ๋ณธํค, ์ธ๋ํค ๊ฐ์ ์ฉ์ด๋ https://jerryjerryjerry.tistory.com/49์ฌ๊ธฐ์ ํ์ธํ๋ฉด ๋๋ค.
- ๊ทธ ์ด์์ 4NF, 5NF๋ ๊ณ ๊ธ ์ ๊ทํ์ธ๋ฐ ๋๋ฌด ์๊ฒ ์ชผ๊ฐ์ ๋ฐ์ํ ์ ์๋ ๋ถ์์ฉ์ด ์กด์ฌํ๋ค
์ ๊ทํ ๋จ์ ์ด๋ผ๋ฉด relation์ด ๋ถ๋ฆฌ๋๋ฉฐ JOIN์ฐ์ฐ์ ํ์์ฑ์ด ๋ ๋ง์์ ธ์ ์ฟผ๋ฆฌ ์๋ต ์๊ฐ์ด ๋๋ ค์ง ์ ์๋ค๋ ๊ฒ ์๋ค.
๋ฐ์ ๊ทํ๋ ์กฐ์ธ์ ์ค์ด๋ ๊ฑด๋ฐ ๊ทธ๋ฌ๋ฉด ์ ๊ทํ๋ฅผ ๋ฐ๋๋ก ํ๋ ๊ฑฐ๋ผ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์๋ค์ผ ์ ์๋ค. ์ ๊ทํ๋ฅผ ํ๋ฉด ์ ํฉ์ฑ(๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅธ์ง๋ ์๊ด์์ด ๋ฐ์ดํฐ๋ค์ ๊ฐ์ด ์ผ์นํ๋ ์ํ)๊ณผ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋๋ค. ๋ฐ์ ๊ทํ์ ๋ชฉ์ ์ ์๋์ ์ผ๋ก ์ค๋ณต์ ๋ง๋ค์ด์ ์ฝ๊ธฐ ์ฑ๋ฅ์ ์ฌ๋ฆฌ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐ๋๋ก ์ด์ํ์๋ ๋ฐ์ํ ์ ์๋ `C,U,D`์ ์ฌ์ฉ๋๋ ์์ ์ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค. DB๋ ๋ณด์กฐ๋ฉ๋ชจ๋ฆฌ(๋์คํฌ)์ ์ ์ฅ๋๋๋ฐ, ์ฝ๊ธฐ์ฑ๋ฅ์ ์ฌ๋ฆฌ๋ ค๊ณ ์ ๊ทผํ์๋ฅผ ์ค์ด๋ ๋ฐฉ์์ด ๋ฐ์ ๊ทํ์ด๋ค.
# RDBMS์ NoSQL(Not Only SQL)์ ์ฐจ์ด
Relation์ผ๋ก ์ด๋ค์ง ์คํค๋ง๋ก ๊ตฌ์ฑ๋ RDBMS๋ scale-out(์ํ ์ค์ผ์ผ ํ์ฅ) ์ ๋ฒ๊ฑฐ๋กญ๋ค.
๋ฐ์ดํฐ๊ฐ join์ ํตํด ํ์ฑ๋ ๊ฒ์ด๊ณ ๊ทธ๋ฌ๋ฉด ์์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ง๋ค์ด์ ธ์์ด์ ์ค๋ฉํ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ถ์ด๋ฒ๋ฆด ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. NoSQL์ ๋ ๋ฆฝํ ๊ฐ์ฒด๋ก ์ ์ฅํ๊ณ ์์ด์ ์ ์ด์ ๋จ์ผ์๋ฒ์ ๊ทธ๋๋ก ์์ฃผํ๊ณ ์๋ค. ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์กฐ์ธ ์์ด ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ NoSQL์ด ๋น ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํจ๊ณผ์ ์ด๋ค. ๋ถ์ฐ ์ฒ๋ฆฌ์ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ๋ถ์ฐํ ๊ตฌ์กฐ๋ก ์ธํด ์์ฐ์ค๋ฝ๊ฒ ๊ฐ๋ฅํ๊ณ Relation์ด ์๊ธฐ ๋๋ฌธ์ ์ํํ์ฅ์ด ์ฝ๋ค.
๊ทธ๋์ relation์ด ์์ด์ ์ผ๊ด์ฑ์ด ํญ์ ๋ณด์ฅ๋์ง๋ ์์ ์ฃผ์ํด์ผ๋๊ณ ์กฐ์ธ์ ๊ตฌํํ๋ ค๋ฉด ๊ฐ ํ ์ด๋ธ์ ์ผ๋จ ๊ฐ์ ธ์์ ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ์ผํ๋ค.
- ์ค๋ฉ(Sharding) : ํ๋์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค์์ DB์ ๋ถ์ฐ์ํค๋ ๋ฐฉ๋ฒ. ์ฃผ๋ก ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋จ์ผ DB์ ์ ์ฅํ๊ธฐ์๋ ๋๋ฌด ํด ๋ ์ฌ์ฉํ๋ค
- ํํฐ์ ๋ : ๋ ผ๋ฆฌ์ ์ธ ๋ฐ์ดํฐ element ๋ค์ ๋ค์์ entity๋ก ์ชผ๊ฐ๋ ํ์๋ฅผ ๋ปํ๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด ์ฆ ํฐ table์ด๋ index๋ฅผ, ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด partition์ด๋ผ๋ ์์ ๋จ์๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋๋ ๊ฒ์ ์๋ฏธํ๋ค
# ํธ๋์ญ์
ํธ๋์ญ์ ์ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์๋ก Commitํ๊ฑฐ๋ Rollbackํด์ ์คํ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ๋กค๋ฐฑํ ์ ์๋ค๋ ๊ฒ ์ฅ์ ์ด๋ค. ๋ถ์ ํฉ์ด ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ์์ผ ์๋ฐฉํ ์ ์๋ค.
ACID๋ผ๋ ์ฑ์ง์ด ์๋ค.
- `Atomicity`(์์์ฑ) - Commit or Rollback
- ํธ๋์ญ์ ์ ์ฐ์ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๋ฐ์๋๋ ์ง ์๋๋ฉด ์ ํ ๋ฐ์๋์ง ์์์ผ ํ๋ค.
- ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ๋ช ๋ น์ ๋ฐ๋์ ์๋ฒฝํ ์ํ๋์ด์ผ ํ๋ฉฐ, ๋ชจ๋๊ฐ ์๋ฒฝํ ์ ํ๋์ง ์๊ณ ์ด๋ํ๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ํธ๋์ญ์ ์์ ์ด์ ์ผ๋ก ๋๋๋ ค์ ์์์ฑ์ ๋ณด์ฅํ๋ค.
- `Consistency`(์ผ๊ด์ฑ)
- ํธ๋์ญ์ ์ํ ์ ๊ณผ, ์ํ ์๋ฃ ํ์ ์ํ๊ฐ ๊ฐ์์ผ ํ๋ค.
- `Isolation`(๋
๋ฆฝ์ฑ, ๊ฒฉ๋ฆฌ์ฑ)
- ๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ๋ณํ ์คํ๋๋ ๊ฒฝ์ฐ ์ด๋ ํ๋์ ํธ๋์ญ์ ์คํ์ค์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ด ๋ผ์ด๋ค ์ ์๋ค.
- ์ํ์ค์ธ ํธ๋์ญ์ ์ ์์ ํ ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ๊ฒฉ๋ฆฌ์ฑ์ ์ฝ๊ธฐ ์ผ๊ด์ฑ๊ณผ ๋์์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ์ฑ์ง
- `Durability`(์์์ฑ, ์ง์์ฑ)
- ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํธ๋์ญ์ ์ ๊ฒฐ๊ณผ๋ ์์คํ ์ด ๊ณ ์ฅ๋๋๋ผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํ๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ Level์ด๋ผ๋ ๊ฒ ์กด์ฌํ๋ค. ์ด๊ฒ์ ๋ฐ๋ผ ์ฝ๊ธฐ ์ผ๊ด์ฑ์ด ๋ฌ๋ผ์ง๊ธฐ๋๋ฌธ์ ์ค์ํ ๊ฐ๋ ์ด๋ค.
์์์ ๋ถํฐ ๋ ๋ฒจ 0~3์ด๊ณ ๋ ๋ฒจ 2์ธ Repeatable Read๊ฐ MySQL InnoDB์ ๊ธฐ๋ณธ isolation level์ด๋ค.
๋ ๋ฒจ์ ๋๋ฌด ๋ฎ๊ฒ ์ก์ผ๋ฉด ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ์ ๋๋ก ๋ณด์ฅํ ์ ์๊ณ , ๋๋ฌด ๋๊ฒ ์ก์ผ๋ฉด ๋์์ฑ ํ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ ค์ ธ์ ์ ๋นํ ํธ๋ ์ด๋ ์คํ๊ฐ ํ์ํ๋ค.
- ๋ ๋ฒจ 0์ธ Read Uncommitted ๋ ์ปค๋ฐ๋์ง ์์ ๋ด์ฉ์ ๋ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
- ๋ ๋ฒจ 1์ธ Read Committed ๋ ์ปค๋ฐ๋ ๋ด์ฉ์ ๋ํด์๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
- ๋ ๋ฒจ 2์ธ Repeatable Read ๋ ์ ํ ํธ๋์ญ์ ์ด ์ฝ์ ๋ฐ์ดํฐ๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋ ๋๊ฐ์ง ํํ ํธ๋์ญ์ ์ด ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ ๋ถํํจ์ผ๋ก์จ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ฟผ๋ฆฌํ์ ๋ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
- ๋ ๋ฒจ 3์ธ Serializable Read ๋ ์ ํ ํธ๋์ญ์ ์ด ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ํํ ํธ๋์ญ์ ์ด ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ํ์ง ๋ชปํ ๋ฟ๋ง ์๋๋ผ ์ค๊ฐ์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๊ฒ๋ ๋ง์์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ฒฝํ๊ฒ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ค. ๋จ, ๋์์ฑ์ ๋ํ ์ฑ๋ฅ์ ๋งค์ฐ ๋จ์ด์ง๋ค.
# ๋์์ฑ ์ ์ด - ์ง๋ ฌ์ฑ์ ์งํค๊ธฐ ์ํด ํ์ํ ํ์ ์์
Locking, Timestamp, Validation์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- `Locking`
- ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ์ lock์ ๊ฑธ๋ฉด ๋ค๋ฅธ ํธ๋์ญ์ ์ unlock ์ ๊น์ง ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ง์ ๊ต์ฐฉ์ํ๋ ๊ธฐ์์ํ๊ฐ ๋ฐ์ํ ์ ์๋ ์ํ์ด ์๋ค๋ ๋ง์ด ๋๋ค.
- `Timestamp`
- ๋จผ์ ๋ค์ด์จ ํธ๋์ญ์ ์ด ํญ์ ๋ ๋นจ๋ฆฌ ์ํ๋๋ค. ๋ฆ์ ๊ฒ ๋ถํฐ ์ฒ๋ฆฌํ๋ ์ค์ผ์ค๋ง ๋ฐฉ์๊ณผ ๋น์ทํ๋ค.
- `Validation`
- ๋ฉ๋ชจ๋ฆฌ์์ ๋ณต์ฌ๋ณธ์์ ์ฐ์ฐ์ ์ํํ๊ณ ๊ฒ์ฆ์๋ฃ์ DB์ ๋ฐ์ํ๋ค. ์ฝ๊ธฐ-๊ฒ์ฆ-์ฐ๊ธฐ 3๋จ๊ณ๋ก ์ด๋ค์ ธ์๋ค.
- ์ฝ๊ธฐ๋ ๋ณต์ฌ๋ณธ์ ๋ฐ๋ก ๋ง๋ค์ง ์๋๋ค.
- ๊ฒ์ฆ๋จ๊ณ์์๋ ํด๋น ํธ๋์ญ์ ์ ์ํํ๋ ๋์ ์ง๋ ฌํ๊ฐ ์ง์ผ์ก๋์ง ๊ฒ์ฆํ๋ค.
- ์ ํจํ๋ค๋ฉด ์ ๋ฐ์ดํธ ๋ ๋ถ๋ถ๋ค์ DB์ ์ ์ฉํ๋ค.
DB ์ธ๋ฑ์ฑ ๊ณต๋ถ๋ ๋์ค์ ์ ๋ฆฌํด์ ์ฌ๋ฆฌ๊ฒ ๋ค. ์๋๋ ๊ณต๋ถํ๊ณ ์๋ ์ฐธ๊ณ ๋งํฌ
https://github.com/NKLCWDT/cs/blob/main/Database/Index%2C%20Hint.md
::์ถ์ฒ::
https://github.com/VSFe/Tech-Interview?tab=readme-ov-file
https://github.com/WooVictory/Ready-For-Tech-Interview
https://github.com/gyoogle/tech-interview-for-developer
https://github.com/JaeYeopHan/Interview_Question_for_Beginner
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^