Skip to content

Latest commit

Β 

History

History
144 lines (64 loc) Β· 5.87 KB

File metadata and controls

144 lines (64 loc) Β· 5.87 KB

SQL vs NoSQL

λ°±μ—”λ“œ κ°œλ°œμ„ 주둜 ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ •ν™•ν•œ 차이λ₯Ό λͺ¨λ₯Έλ‹€.

κ·Έλž˜μ„œ 각각이 μ–Έμ œ 쓰이고 무슨 νŠΉμ§•κ³Ό 차이점을 κ°–λŠ”μ§€ κ³΅λΆ€ν•˜κ³  μ •λ¦¬ν•˜λ € ν•œλ‹€.

μ›Ή 앱을 κ°œλ°œν•  λ•Œ, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 선택할 λ•Œ κ³ λ―Όν•˜κ²Œ λœλ‹€.

  • MySQLκ³Ό 같은 SQL을 μ‚¬μš©ν• κΉŒ? μ•„λ‹ˆλ©΄ MongoDB와 같은 NoSQL을 μ‚¬μš©ν• κΉŒ?

보톡 Springμ—μ„œ κ°œλ°œν•  λ•ŒλŠ” MySQL을, Node.jsμ—μ„œ μ‚¬μš©ν•  λ•ŒλŠ” MongoDBλ₯Ό 주둜 μ‚¬μš©ν–ˆμ„ 것이닀. ν•˜μ§€λ§Œ λ‹¨μˆœνžˆ ν”„λ ˆμž„μ›Œν¬μ— 따라 κ²°μ •ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜κΈ° μ•žμ„œ μ ν•©ν•œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 택해야 ν•œλ‹€.

이에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

SQL (κ΄€κ³„ν˜• DB)

  • SQL을 μ‚¬μš©ν•˜λ©΄ RDBMSμ—μ„œ 데이터λ₯Ό μ €μž₯, μˆ˜μ •, μ‚­μ œ 및 검색할 수 μžˆλ‹€.
  • κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” 핡심적인 두 κ°€μ§€ νŠΉμ§•μ΄ μžˆλ‹€.
    1. λ°μ΄ν„°λŠ” μ •ν•΄μ§„ 데이터 μŠ€ν‚€λ§ˆμ— 따라 ν…Œμ΄λΈ”μ— μ €μž₯λœλ‹€.
    2. λ°μ΄ν„°λŠ” 관계λ₯Ό 톡해 μ—¬λŸ¬ ν…Œμ΄λΈ”μ— λΆ„μ‚°λœλ‹€.

λ°μ΄ν„°λŠ” ν…Œμ΄λΈ”μ— λ ˆμ½”λ“œλ‘œ μ €μž₯λ˜λŠ”λ°, 각 ν…Œμ΄λΈ”λ§ˆλ‹€ λͺ…ν™•ν•˜κ²Œ μ •μ˜λœ ꡬ쑰가 μžˆλ‹€. ν•΄λ‹Ή κ΅¬μ‘°λŠ” ν•„λ“œμ˜ 이름과 데이터 μœ ν˜•μœΌλ‘œ μ •μ˜λœλ‹€.

λ”°λΌμ„œ μŠ€ν‚€λ§ˆλ₯Ό μ€€μˆ˜ν•˜μ§€ μ•Šμ€ λ ˆμ½”λ“œλŠ” ν…Œμ΄λΈ”μ— μΆ”κ°€ν•  수 μ—†λ‹€. 즉, μŠ€ν‚€λ§ˆλ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” 이상은 μ •ν•΄μ§„ ꡬ쑰에 λ§žλŠ” λ ˆμ½”λ“œλ§Œ μΆ”κ°€κ°€ κ°€λŠ₯ν•œ 것이 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΉμ§• 쀑 ν•˜λ‚˜μ΄λ‹€.

λ˜ν•œ, λ°μ΄ν„°μ˜ 쀑볡을 ν”Όν•˜κΈ° μœ„ν•΄ 관계λ₯Ό μ΄μš©ν•œλ‹€.

ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ 쀑볡 없이 ν•˜λ‚˜μ˜ λ°μ΄ν„°λ§Œμ„ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ λΆ€μ •ν™•ν•œ 데이터λ₯Ό λ‹€λ£° μœ„ν—˜μ΄ μ€„μ–΄λ“œλŠ” μž₯점이 μžˆλ‹€.

NoSQL(λΉ„κ΄€κ³„ν˜• DB)

  • λ§κ·ΈλŒ€λ‘œ κ΄€κ³„ν˜• DB의 λ°˜λŒ€μ΄λ‹€.
  • μŠ€ν‚€λ§ˆλ„ μ—†κ³  관계도 μ—†λ‹€.
  • NoSQLμ—μ„œλŠ” λ ˆμ½”λ“œλ₯Ό λ¬Έμ„œ(documents)라고 λΆ€λ₯Έλ‹€.

μ—¬κΈ°μ„œ SQLκ³Ό 핡심적인 차이가 μžˆλ‹€. SQL은 μ •ν•΄μ§„ μŠ€ν‚€λ§ˆλ₯Ό λ”°λ₯΄μ§€ μ•ŠμœΌλ©΄ 데이터 μΆ”κ°€κ°€ λΆˆκ°€λŠ₯ν–ˆλ‹€.

ν•˜μ§€λ§Œ NoSQLμ—μ„œλŠ” λ‹€λ₯Έ ꡬ쑰의 데이터λ₯Ό 같은 μ»¬λ ‰μ…˜μ— μΆ”κ°€κ°€ κ°€λŠ₯ν•˜λ‹€.

λ¬Έμ„œ(documents)λŠ” Jsonκ³Ό λΉ„μŠ·ν•œ ν˜•νƒœλ‘œ κ°€μ§€κ³  μžˆλ‹€. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ²˜λŸΌ μ—¬λŸ¬ ν…Œμ΄λΈ”μ— λ‚˜λˆ„μ–΄λ‹΄μ§€ μ•Šκ³ , κ΄€λ ¨ 데이터λ₯Ό λ™μΌν•œ 'μ»¬λ ‰μ…˜'에 λ„£λŠ”λ‹€.

λ”°λΌμ„œ μœ„μ˜ μ‚¬μ§„μ˜ SQLμ—μ„œ μ§„ν–‰ν•œ Orders, Users, Products ν…Œμ΄λΈ”λ‘œ λ‚˜λˆˆ 것을 NoSQLμ—μ„œλŠ” Orders에 ν•œκΊΌλ²ˆμ— ν¬ν•¨ν•΄μ„œ μ €μž₯ν•˜κ²Œ λœλ‹€.

λ”°λΌμ„œ μ—¬λŸ¬ ν…Œμ΄λΈ”μ— 쑰인할 ν•„μš”μ—†μ΄ 이미 ν•„μš”ν•œ λͺ¨λ“  것을 κ°–μΆ˜ λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 NoSQL이닀.

(NoSQLμ—λŠ” μ‘°μΈμ΄λΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.)

그러면 μ‘°μΈν•˜κ³  싢을 λ•Œ NoSQL은 μ–΄λ–»κ²Œ ν• κΉŒ?

μ»¬λ ‰μ…˜μ„ 톡해 데이터λ₯Ό λ³΅μ œν•˜μ—¬ 각 μ»¬λ ‰μ…˜ 일뢀뢄에 μ†ν•˜λŠ” 데이터λ₯Ό μ •ν™•ν•˜κ²Œ μ‚°μΆœν•˜λ„λ‘ ν•œλ‹€.

ν•˜μ§€λ§Œ, 이러면 데이터가 μ€‘λ³΅λ˜μ–΄ μ„œλ‘œ 영ν–₯을 쀄 μœ„ν—˜μ΄ μžˆλ‹€. λ”°λΌμ„œ 쑰인을 잘 μ‚¬μš©ν•˜μ§€ μ•Šκ³  자주 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 데이터일 λ•Œ, NoSQL을 μ“°λ©΄ μƒλ‹Ήνžˆ νš¨μœ¨μ μ΄λ‹€.

ν™•μž₯ κ°œλ…

두 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 비ꡐ할 λ•Œ μ€‘μš”ν•œ Scaling κ°œλ…λ„ μ‘΄μž¬ν•œλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ ν™•μž₯성은 수직적 ν™•μž₯κ³Ό μˆ˜ν‰μ  ν™•μž₯으둜 λ‚˜λˆ„μ–΄μ§„λ‹€.

  • 수직적 ν™•μž₯ : λ‹¨μˆœνžˆ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 것(ex. CPU μ—…κ·Έλ ˆμ΄λ“œ)
  • μˆ˜ν‰μ  ν™•μž₯ : 더 λ§Žμ€ μ„œλ²„κ°€ μΆ”κ°€λ˜κ³  λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ „μ²΄μ μœΌλ‘œ 뢄산됨을 μ˜λ―Έν•œλ‹€.(ν•˜λ‚˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μž‘λ™ν•˜μ§€λ§Œ, μ—¬λŸ¬ ν˜ΈμŠ€νŠΈμ—μ„œ μž‘λ™)

데이터 μ €μž₯ λ°©μ‹μœΌλ‘œ 인해 SQL DBλŠ” 일반적으둜 수직적 ν™•μž₯만 μ§€μ›ν•œλ‹€.

μˆ˜ν‰μ  ν™•μž₯은 NoSQL DBμ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€.

λ‘˜ 쀑에 뭘 μ„ νƒν•˜λŠλƒμ— λŒ€ν•œ 정닡은 μ—†λ‹€. μ–΄λ–€ 데이터λ₯Ό λ‹€λ£¨λŠλƒμ— 따라 μ›ν•˜λŠ” 방식에 맞게 선택을 κ³ λ €ν•˜λ©΄ λœλ‹€.

SQL μž₯/단점

[μž₯점]

  • λͺ…ν™•ν•˜κ²Œ μ •μ˜λœ μŠ€ν‚€λ§ˆ, 데이터 무결성 보μž₯
  • κ΄€κ³„λŠ” 각 데이터λ₯Ό 쀑볡 없이 ν•œλ²ˆλ§Œ μ €μž₯.

[단점]

  • 덜 μœ μ—°ν•˜λ‹€. 데이터 μŠ€ν‚€λ§ˆλ₯Ό 사전에 κ³„νšν•˜κ³  μ•Œλ €μ•Ό ν•œλ‹€.(λ‚˜μ€‘μ— μˆ˜μ •ν•˜κΈ° νž˜λ“¦.)
  • 관계λ₯Ό λ§Ίκ³  μžˆμ–΄μ„œ 쑰인문이 λ§Žμ€ λ³΅μž‘ν•œ 쿼리가 λ§Œλ“€μ–΄μ§ˆ 수 있음.
  • λŒ€μ²΄λ‘œ 수직적 ν™•μž₯만 κ°€λŠ₯ν•˜λ‹€.

NoSQL μž₯/단점

[μž₯점]

  • μŠ€ν‚€λ§ˆκ°€ μ—†μ–΄μ„œ μœ μ—°ν•˜λ‹€. μ–Έμ œλ“ μ§€ μ €μž₯된 데이터λ₯Ό μ‘°μ •ν•˜κ³  μƒˆλ‘œμš΄ ν•„λ“œ μΆ”κ°€κ°€ κ°€λŠ₯ν•˜λ‹€.
  • λ°μ΄ν„°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”λ‘œ ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ €μž₯λœλ‹€. 데이터λ₯Ό μ½μ–΄μ˜€λŠ” 속도가 빨라진닀.
  • 수직 및 μˆ˜ν‰ ν™•μž₯이 κ°€λŠ₯ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ°œμƒμ‹œν‚€λŠ” λͺ¨λ“  읽기/μ“°κΈ° μš”μ²­ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

[단점]

  • μœ μ—°μ„±μœΌλ‘œ 인해 데이터 ꡬ쑰 결정을 미루게 될 수 μžˆλ‹€.
  • 데이터 쀑볡을 계속 μ—…λ°μ΄νŠΈ ν•΄μ•Ό ν•œλ‹€.
  • 데이터가 μ—¬λŸ¬ μ»¬λ ‰μ…˜μ— μ€‘λ³΅λ˜μ–΄ 있기 λ•Œλ¬Έμ— μˆ˜μ •μ‹œ λͺ¨λ“  μ»¬λ ‰μ…˜μ—μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€. (SQLμ—μ„œλŠ” 쀑볡 데이터가 μ—†μœΌλ―€λ‘œ ν•œλ²ˆλ§Œ μˆ˜ν–‰μ΄ κ°€λŠ₯)

SQL DB μ‚¬μš©μ΄ 더 쒋을 λ•Œ

  • 관계λ₯Ό λ§Ίκ³  μžˆλŠ” 데이터가 자주 λ³€κ²½λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우

    NoSQLμ—μ„œλŠ” μ—¬λŸ¬ μ»¬λ ‰μ…˜μ„ λͺ¨λ‘ μˆ˜μ •ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ 

  • 변경될 μ—¬μ§€κ°€ μ—†κ³ , λͺ…ν™•ν•œ μŠ€ν‚€λ§ˆκ°€ μ‚¬μš©μžμ™€ λ°μ΄ν„°μ—κ²Œ μ€‘μš”ν•œ 경우

NoSQL DB μ‚¬μš©μ΄ 더 쒋을 λ•Œ

  • μ •ν™•ν•œ 데이터 ꡬ쑰λ₯Ό μ•Œ 수 μ—†κ±°λ‚˜ λ³€κ²½/ν™•μž₯이 될 수 μžˆλŠ” 경우
  • 읽기λ₯Ό 자주 ν•˜μ§€λ§Œ, 데이터 변경은 자주 μ—†λŠ” 경우
  • λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μˆ˜ν‰μœΌλ‘œ ν™•μž₯ν•΄μ•Ό ν•˜λŠ” 경우(λ§‰λŒ€ν•œ μ–‘μ˜ 데이터λ₯Ό 닀뀄야 ν•˜λŠ” 경우)