WILT/DB

[DB] SQL vs NoSQL

kexon 2022. 8. 7. 15:23

πŸ’™ SQL  vs  NoSQL

  SQL NoSQL
기반 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€
데이터 μ €μž₯ SQL을 μ΄μš©ν•΄μ„œ 데이터λ₯Ό ν…Œμ΄λΈ”μ— μ €μž₯ key-value, document, wide-column, graph λ“±μ˜ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ €μž₯
데이터 ν˜•μ‹ ν–‰(μ—΄μ˜ 데이터 ν˜•μ‹)κ³Ό μ—΄(속성)둜 ꡬ성 데이터가 κ³ μ •λ˜μ–΄μžˆμ§€ μ•ŠμŒ
μŠ€ν‚€λ§ˆ - μŠ€ν‚€λ§ˆμ— 맞좰 μ½μ–΄μ™€μ„œ μ§κ΄€μ μœΌλ‘œ νŒŒμ•… κ°€λŠ₯
- μ²˜λ¦¬ν•˜λ €λŠ” 데이터 μ†μ„±λ³„λ‘œ μ—΄(column)에 λŒ€ν•œ 정보λ₯Ό 미리 정해야됨
- μŠ€ν‚€λ§ˆμ— 따라 데이터λ₯Ό μ½μ–΄μ˜΄(schema on read)
- ν–‰ μΆ”κ°€ μ‹œ μ¦‰μ‹œ μƒˆλ‘œμš΄ 열을 μΆ”κ°€ν•  수 있음
- κ°œλ³„ 속성에 λͺ¨λ“  μ—΄ 데이터λ₯Ό λ°˜λ“œμ‹œ μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ 됨
쿼리 ν…Œμ΄λΈ”μ˜ ν˜•μ‹κ³Ό ν…Œμ΄λΈ”κ°„μ˜ 관계에 맞좰 데이터λ₯Ό μš”μ²­ ꡬ쑰화 λ˜μ§€ μ•Šμ€ 쿼리 μ–Έμ–΄λ‘œλ„ 데이터 μš”μ²­μ΄ κ°€λŠ₯
ν™•μž₯μ„± 수직적으둜 ν™•μž₯ μˆ˜ν‰μ μœΌλ‘œ ν™•μž₯
μ’…λ₯˜ MySQL, Oracle, SQLite, PostgresSQL, MariaDB MongoDB, Casandra

πŸ’™ NoSQL기반 λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ ꡬ성

Key-Value νƒ€μž…

  • 속성을 Key-Value의 쌍으둜 λ‚˜νƒ€λ‚΄λŠ” 데이터λ₯Ό λ°°μ—΄μ˜ ν˜•νƒœλ‘œ μ €μž₯
  • Key: μ†μ„± 이름
  • Value: μ†μ„±μ— μ—°κ²°λœ 데이터 κ°’
  • λŒ€ν‘œμ μΈ Key-Value ν˜•μ‹μ˜ λ°μ΄ν„°λ² μ΄μŠ€: Redis, Dynamo λ“±

λ¬Έμ„œν˜•(Document) λ°μ΄ν„°λ² μ΄μŠ€

  • 데이터λ₯Ό ν…Œμ΄λΈ”μ΄ μ•„λ‹Œ λ¬Έμ„œμ²˜λŸΌ μ €μž₯ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€
  • λ§Žμ€ λ¬Έμ„œν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ JSONκ³Ό μœ μ‚¬ν•œ ν˜•μ‹μ˜ 데이터λ₯Ό λ¬Έμ„œν™”ν•˜μ—¬ μ €μž₯
  • 각각의 λ¬Έμ„œλŠ” ν•˜λ‚˜μ˜ 속성에 λŒ€ν•œ 데이터λ₯Ό κ°€μ§€κ³  있고, μ»¬λ ‰μ…˜μ΄λΌκ³  ν•˜λŠ” 그룹으둜 λ¬Άμ–΄μ„œ 관리
  • λŒ€ν‘œμ μΈ λ¬Έμ„œν˜• λ°μ΄ν„°λ² μ΄μŠ€: MongoDB

Wide-Column λ°μ΄ν„°λ² μ΄μŠ€

  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—΄(column) 데이터λ₯Ό μ§‘μ€‘μ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€
  • 각 μ—΄μ—λŠ” key-value ν˜•μ‹μœΌλ‘œ 데이터가 μ €μž₯되고, 컬럼 νŒ¨λ°€λ¦¬(column families)라고 ν•˜λŠ” μ—΄ 집합체 λ‹¨μœ„λ‘œ 데이터λ₯Ό 처리
  • ν•˜λ‚˜μ˜ 행에 λ§Žμ€ 열을 포함할 수 μžˆμ–΄μ„œ μœ μ—°μ„±μ΄ λ†’μŒ
  • 데이터 μ²˜λ¦¬μ— ν•„μš”ν•œ 열을 μœ μ—°ν•˜κ²Œ 선택할 수 μžˆμ–΄μ„œ 규λͺ¨κ°€ 큰 데이터 뢄석에 주둜 μ‚¬μš©
  • λŒ€ν‘œμ μΈ wide-column λ°μ΄ν„°λ² μ΄μŠ€: Cassandra, HBase

κ·Έλž˜ν”„(Graph) λ°μ΄ν„°λ² μ΄μŠ€

  • 자료ꡬ쑰의 κ·Έλž˜ν”„μ™€ λΉ„μŠ·ν•œ ν˜•μ‹μœΌλ‘œ 데이터 κ°„μ˜ 관계λ₯Ό κ΅¬μ„±ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€
  • λ…Έλ“œ(nodes)에 속성별(entities)둜 데이터λ₯Ό μ €μž₯
  • 각 λ…Έλ“œκ°„ κ΄€κ³„λŠ” μ„ (edge)으둜 ν‘œν˜„
  • λŒ€ν‘œμ μΈ κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€: Neo4J, InfiniteGraph

πŸ’™ SQL 기반 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우

1. λ°μ΄ν„°λ² μ΄μŠ€μ˜ ACID μ„±μ§ˆμ„ μ€€μˆ˜ν•΄μ•Ό ν•  λ•Œ

  • ACID: Atomicity(μ›μžμ„±), Consistency(일관성), Isolation(독립성), Durability(지속성)
  • ACIDλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜(Transaction)의 μƒνƒœλ³€ν™”λ₯Ό μˆ˜ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ μ•ˆμ „μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ„±μ§ˆμ΄λ‹€. SQL을 μ‚¬μš©ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έ μž‘μš©ν•˜λŠ” 방식을 μ •ν™•ν•˜κ²Œ κ·œμ •ν•  수 있기 λ•Œλ¬Έμ— λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έμ μΈ 상황을 쀄이고, λ°μ΄ν„°λ² μ΄μŠ€μ˜ 무결성을 λ³΄ν˜Έν•  수 μžˆλ‹€.
  • λͺ¨λ“  금육 μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œλŠ” λ°˜λ“œμ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ACID μ„±μ§ˆμ„ μ€€μˆ˜ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 SQL을 μ΄μš©ν•œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

2. μ†Œν”„νŠΈμ›¨μ–΄μ— μ‚¬μš©λ˜λŠ” 데이터가 ꡬ쑰적이고 일관적일 λ•Œ

  • μ†Œν”„νŠΈμ›¨μ–΄(ν”„λ‘œμ νŠΈ)의 규λͺ¨κ°€ λ§Žμ€ μ„œλ²„λ₯Ό ν•„μš”λ‘œ ν•˜μ§€ μ•Šκ³  μΌκ΄€λœ 데이터λ₯Ό μ‚¬μš©ν•  λ•Œ 주둜 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€. λ‹€μ–‘ν•œ 데이터 μœ ν˜•κ³Ό 높은 νŠΈλž˜ν”½μ„ μ§€μ›ν•˜λ„λ‘ μ„€κ³„λœ NoSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ ν•˜λŠ” μ΄μœ κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

πŸ’™ NoSQL 기반 λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우

  1. λ°μ΄ν„°μ˜ ꡬ쑰가 거의 λ˜λŠ” μ „ν˜€ μ—†λŠ” λŒ€μš©λŸ‰μ˜ 데이터λ₯Ό μ €μž₯ν•  λ•Œ
    • λŒ€λΆ€λΆ„μ˜ NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ €μž₯ν•  수 μžˆλŠ” λ°μ΄ν„°μ˜ μœ ν˜•μ— μ œν•œμ΄ μ—†κΈ° λ•Œλ¬Έμ— μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— μ •ν˜•ν™” λ˜μ§€ μ•Šμ€ λ§Žμ€ μ–‘μ˜ 데이터가 ν•„μš”ν•œ 경우 NoSQL을 μ μš©ν•˜λŠ” 것이 더 효율적일 수 μžˆλ‹€.
  2. ν΄λΌμš°λ“œ μ»΄ν“¨νŒ… 및 μ €μž₯곡간을 μ΅œλŒ€ν•œ ν™œμš©ν•  λ•Œ
    • ν΄λΌμš°λ“œ 기반으둜 λ°μ΄ν„°λ² μ΄μŠ€ μ €μž₯μ†Œλ₯Ό κ΅¬μΆ•ν•˜λ©΄, μ €λ ΄ν•œ λΉ„μš©μ˜ μ†”λ£¨μ…˜μ„ μ œκ³΅λ°›μ„ 수 μžˆλ‹€. μ†Œν”„νŠΈμ›¨μ–΄μ— λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν™•μž₯성이 μ€‘μš”ν•˜λ‹€λ©΄, μœ μ—°ν•˜κ²Œ ν™•μž₯ν•  수 μžˆλŠ” NoSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
  3. λΉ λ₯΄κ²Œ μ„œλΉ„μŠ€λ₯Ό κ΅¬μΆ•ν•˜λŠ” κ³Όμ •μ—μ„œ 데이터 ꡬ쑰λ₯Ό 자주 μ—…λ°μ΄νŠΈν•  λ•Œ
    • NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” μŠ€ν‚€λ§ˆλ₯Ό 미리 μ€€λΉ„ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— λΉ λ₯΄κ²Œ κ°œλ°œν•˜λŠ” κ³Όμ •μ—μ„œ 맀우 μœ λ¦¬ν•˜λ‹€. (ex. λΉ λ₯΄κ²Œ ν”„λ‘œν† νƒ€μž…μ„ μΆœμ‹œν•΄μ•Ό ν•  λ•Œ)
    • μ†Œν”„νŠΈμ›¨μ–΄ λ²„μ „λ³„λ‘œ λ§Žμ€ λ‹€μš΄νƒ€μž„(λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„λ₯Ό μ˜€ν”„λΌμΈμœΌλ‘œ μ „ν™˜ν•˜μ—¬ 데이터 처리λ₯Ό μ§„ν–‰ν•˜λŠ” μž‘μ—… μ‹œκ°„)없이 데이터 ꡬ쑰λ₯Ό 자주 μ—…λ°μ΄νŠΈ ν•΄μ•Όν•˜λŠ” 경우, μŠ€ν‚€λ§ˆλ₯Ό 맀번 μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 보닀 NoSQL 기반의 λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 게 더 μ ν•©ν•˜λ‹€.

πŸ’™ Which one do we use?

ν•œλ²ˆμ— μ™„μ „ν•œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜λŠ” 방법은 μ—†κΈ° λ•Œλ¬Έμ— κ°œλ°œμžλ“€μ€ κ΄€κ³„ν˜•, λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€μ— 맞좰 μ„€κ³„ν•œλ‹€. NoSQL 기반의 λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€κ°€ ν™•μž₯μ„±μ΄λ‚˜ μ†λ„λ©΄μ—μ„œ 더 λ›°μ–΄λ‚˜μ§€λ§Œ, κ³ μ°¨μ›μœΌλ‘œ κ΅¬μ‘°ν™”λœ SQL 기반의 λ°μ΄ν„°λ² μ΄μŠ€κ°€ 더 쒋은 μ„±λŠ₯을 λ³΄μ—¬μ£ΌλŠ” μ„œλΉ„μŠ€λ„ 있기 λ•Œλ¬Έμ— μ—¬λŸ¬ μ‚¬μš© 사둀λ₯Ό μ‚΄νŽ΄λ³΄κ³  μ μ ˆν•œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.