[DB] SQL vs NoSQL
π 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 κΈ°λ° λΉκ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ κ²½μ°
- λ°μ΄ν°μ κ΅¬μ‘°κ° κ±°μ λλ μ ν μλ λμ©λμ λ°μ΄ν°λ₯Ό μ μ₯ν λ
- λλΆλΆμ NoSQL λ°μ΄ν°λ² μ΄μ€λ μ μ₯ν μ μλ λ°μ΄ν°μ μ νμ μ νμ΄ μκΈ° λλ¬Έμ μννΈμ¨μ΄ κ°λ°μ μ νν λμ§ μμ λ§μ μμ λ°μ΄ν°κ° νμν κ²½μ° NoSQLμ μ μ©νλ κ²μ΄ λ ν¨μ¨μ μΌ μ μλ€.
- ν΄λΌμ°λ μ»΄ν¨ν
λ° μ μ₯곡κ°μ μ΅λν νμ©ν λ
- ν΄λΌμ°λ κΈ°λ°μΌλ‘ λ°μ΄ν°λ² μ΄μ€ μ μ₯μλ₯Ό ꡬμΆνλ©΄, μ λ ΄ν λΉμ©μ μ루μ μ μ 곡λ°μ μ μλ€. μννΈμ¨μ΄μ λ°μ΄ν°λ² μ΄μ€μ νμ₯μ±μ΄ μ€μνλ€λ©΄, μ μ°νκ² νμ₯ν μ μλ NoSQL λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
- λΉ λ₯΄κ² μλΉμ€λ₯Ό ꡬμΆνλ κ³Όμ μμ λ°μ΄ν° ꡬ쑰λ₯Ό μμ£Ό μ
λ°μ΄νΈν λ
- NoSQL λ°μ΄ν°λ² μ΄μ€λ μ€ν€λ§λ₯Ό 미리 μ€λΉν νμκ° μκΈ° λλ¬Έμ λΉ λ₯΄κ² κ°λ°νλ κ³Όμ μμ λ§€μ° μ 리νλ€. (ex. λΉ λ₯΄κ² νλ‘ν νμ μ μΆμν΄μΌ ν λ)
- μννΈμ¨μ΄ λ²μ λ³λ‘ λ§μ λ€μ΄νμ(λ°μ΄ν°λ² μ΄μ€ μλ²λ₯Ό μ€νλΌμΈμΌλ‘ μ ννμ¬ λ°μ΄ν° μ²λ¦¬λ₯Ό μ§ννλ μμ μκ°)μμ΄ λ°μ΄ν° ꡬ쑰λ₯Ό μμ£Ό μ λ°μ΄νΈ ν΄μΌνλ κ²½μ°, μ€ν€λ§λ₯Ό λ§€λ² μμ ν΄μΌ νλ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ λ³΄λ€ NoSQL κΈ°λ°μ λΉκ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ κ² λ μ ν©νλ€.
π Which one do we use?
νλ²μ μμ ν λ°μ΄ν°λ² μ΄μ€λ₯Ό ꡬμΆνλ λ°©λ²μ μκΈ° λλ¬Έμ κ°λ°μλ€μ κ΄κ³ν, λΉκ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό λͺ¨λ μ¬μ©νμ¬ μλΉμ€μ λ§μΆ° μ€κ³νλ€. NoSQL κΈ°λ°μ λΉκ΄κ³ν λ°μ΄ν°λ² μ΄μ€κ° νμ₯μ±μ΄λ μλλ©΄μμ λ λ°μ΄λμ§λ§, κ³ μ°¨μμΌλ‘ ꡬ쑰νλ SQL κΈ°λ°μ λ°μ΄ν°λ² μ΄μ€κ° λ μ’μ μ±λ₯μ 보μ¬μ£Όλ μλΉμ€λ μκΈ° λλ¬Έμ μ¬λ¬ μ¬μ© μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ³ μ μ ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ ννλ κ²μ΄ μ€μνλ€.