Skip to content

MongoDB

gyim1345 edited this page Dec 21, 2020 · 5 revisions

πŸ“Œ MongoDB μ†Œκ°œ

  • nosql(Not Only SQL)
  • Document Database. Collections으둜 ꡬ성 λ˜μ–΄ μžˆλŠ”λ° collection은 table이라고 생각 ν•˜λ©΄ νŽΈν•˜κ³  tableμ•ˆμ— recordλŠ” document둜 ꡬ성 λ˜μ–΄ μžˆλ‹€.
  • documentλŠ” field/value 값을 κ°€μ§€λŠ”λ° 이것은 jsonμ΄λž‘ 거의 같은 ꡬ쑰라고 생각 ν•˜λ©΄λœλ‹€.
  • λ‹€λ₯Έ 점은 documentκ°€ 생성 되면 고유 field 인 _id와 μž„μ˜ μˆ«μžκ°€ value값에 λ“€μ–΄κ°„λ‹€. mongodb

πŸ“Œ νŠΉμ§•

  • λΆ„μ‚° μ»΄ν“¨νŒ… μ‹œμŠ€ν…œ.(sharding, replica)
  • ν™•μž₯성이 뛰어남.(μˆ˜ν‰ν™•μž₯ κ°€λŠ₯)
  • λΉ„μš© 절감 κ°€λŠ₯ (μ €λ ΄ν•œ λ²”μš© ν•˜λ“œμ›¨μ–΄ ν΄λŸ¬μŠ€ν„°μ— μ‰½κ²Œ μ„€μΉ˜ν•  수 있음)
  • μœ μ—°ν•œ μŠ€ν‚€λ§ˆ 섀계.
  • λΉ„μ •ν˜• 및 λ°˜μ •ν˜• 데이터λ₯Ό μ²˜λ¦¬ν•¨.(json, word, pdf...)
  • λ³΅μž‘ν•œ κ΄€κ³„λŠ” μ—†λ‹€.
  • μ˜€ν”ˆ μ†ŒμŠ€λ‹€.

πŸ“Œ μž₯점

  • documentλŠ” json ν˜•νƒœλΌκ³  λ³Όμˆ˜λ„ μžˆμœΌλ‹ˆ λ§Žμ€ 언어에 ν˜Έν™˜μ΄ λœλ‹€.
    • μ •ν™•νžˆ λ§ν•΄μ„œ bjson이닀. bjson은 binary JSON의 μ•½μžμ΄λ‹€. json 같은 λ¬Έμ„œλ“€μ„ binary둜 encode ν•œκ²ƒμ΄λ‹€.
  • 동적 μŠ€ν‚€λ§ˆ/Schema-less
    • joinless λŒ€μ‹  고속 crud query
    • 탄λ ₯적인 ν™•μž₯μ„±: λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ €λ ΄ν•œ 일반 ν•˜λ“œμ›¨μ–΄μ— μ‚¬μš©ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλ‹€.
    • λΉ… 데이터 μ• ν”Œλ¦¬μΌ€μ΄μ…˜: NoSQL λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λŒ€λŸ‰μ˜ 데이터λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.
    • λΉ„μš©μ ˆκ°: κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” κ³ κ°€μ˜ μŠ€ν† λ¦¬μ§€ μ‹œμŠ€ν…œκ³Ό 독점 μ„œλ²„λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•˜λŠ” 반면, NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜κ³Ό 데이터 λ³Όλ₯¨μ΄ 증가함에 따라 μ €λ ΄ν•œ λ²”μš© ν•˜λ“œμ›¨μ–΄ ν΄λŸ¬μŠ€ν„°μ— μ‰½κ²Œ μ„€μΉ˜ν•  수 μžˆλ‹€. λ”°λΌμ„œ 더 적은 λΉ„μš©μœΌλ‘œ 더 λ§Žμ€ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  μ €μž₯ν•  수 μžˆλ‹€.
    • 동적 μŠ€ν‚€λ§ˆ: 데이터 μž‘μ—…μ„ μ‹œμž‘ν•˜λŠ” 데 μŠ€ν‚€λ§ˆκ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ SQL λ°μ΄ν„°λ² μ΄μŠ€λ‹€. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ¨Όμ € μŠ€ν‚€λ§ˆλ₯Ό μ •μ˜ν•΄μ•Ό ν•˜λ―€λ‘œ μš”κ΅¬μ‚¬ν•­μ΄ 변경될 λ•Œλ§ˆλ‹€ μŠ€ν‚€λ§ˆλ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λ―€λ‘œ 더 μ–΄λ ΅λ‹€.
    • sharding: κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ„Έλ‘œλ‘œ ν™•μž₯λ˜λ―€λ‘œ, μ—¬λŸ¬ μ„œλ²„μ— λΆ„μ‚°λ˜μ–΄ μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ§Žμ€ κ²½μš°κ°€ λ§Žλ‹€. 일반적으둜 NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” μžλ™ 샀딩을 μ§€μ›ν•œλ‹€. 즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„œλ²„ ν’€μ˜ ꡬ성쑰차 인식할 ν•„μš” 없이 기본적으둜 μž„μ˜μ˜ 수의 μ„œλ²„μ— 데이터λ₯Ό μžλ™μœΌλ‘œ λΆ„μ‚°μ‹œν‚¨λ‹€.
    • Replication: λŒ€λΆ€λΆ„μ˜ NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” 가동 쀑단 λ˜λŠ” κ³„νšλœ μœ μ§€λ³΄μˆ˜ 이벀트 μ‹œ κ°€μš©μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ μžλ™ λ°μ΄ν„°λ² μ΄μŠ€ 볡제λ₯Ό μ§€μ›ν•œλ‹€.
    • 캐싱: λŒ€λΆ€λΆ„μ˜ NoSQL κΈ°μˆ μ€ λ›°μ–΄λ‚œ 톡합 캐싱 κΈ°λŠ₯을 κ°–μΆ”κ³  μžˆμ–΄ 자주 μ‚¬μš©λ˜λŠ” 데이터λ₯Ό μ‹œμŠ€ν…œ λ©”λͺ¨λ¦¬μ— μ΅œλŒ€ν•œ 많이 λ³΄κ΄€ν•˜λ©° λ³„λ„μ˜ 캐싱 계측이 ν•„μš”ν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ“Œ 단점

  • λ°μ΄ν„°λ² μ΄μŠ€μ— μ•ˆμ •μ„± κΈ°λŠ₯이 μ—†μŒ(acid ν•˜μ§€ μ•Šλ‹€)
  • ACID(μ›μžμ„±, 일관성, 격리, 내ꡬ성)λŠ” 였λ₯˜, 전원 μž₯μ•  및 기타 μž₯애에도 λΆˆκ΅¬ν•˜κ³  데이터 μœ νš¨μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•œ λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜μ˜ 속성 집합이닀.

πŸ“Œ 데이터 ν‘œν˜„ 방식

  • JSONμ΄λž‘ λΉ„μŠ·ν•œ ν˜•νƒœλΌ μ•„λ¬΄λ ‡κ²Œλ‚˜ 넣을 수 μžˆμ§€λ§Œ 보톡 3κ°€μ§€ λ°©μ‹μœΌλ‘œ μ €μž₯/μ‚¬μš© ν•œλ‹€.
  • Embedded Document Pattern
    • λͺ¨λ“  데이터λ₯Ό ν•œ collection에 μ €μž₯ν•˜λŠ” 방식
    • μž₯점: ν•œ 쿼리둜 정보λ₯Ό λ‹€ κ°€μ Έμ˜¬ 수 μžˆλ‹€
    • 단점:
  • Subset Pattern
    • μ—¬λŸ¬κ°œμ˜ collection을 λ§Œλ“€μ§€λ§Œ collectionμ•ˆμ— λ‹€λ₯Έ collection의 정보λ₯Ό μ€‘λ³΅μ μœΌλ‘œ κ°€μ§€κ³  μžˆλŠ” 방식
    • μž₯점: collection이 λΉ„λŒ€ν•΄μ§€λŠ”κ²ƒμ„ λ°©μ§€ν•˜κ³  자주 μ ‘ν•˜λŠ” data듀을 subset에 ν¬ν•¨ν•¨μœΌλ‘œμ¨ caching λΉ„μŠ·ν•œ 역할을 ν•  수 μžˆλ‹€.
    • 단점: μˆ˜μ •μ΄ μžˆλ‹€λ©΄ κ·Έ dataκ°€ μžˆλŠ” λͺ¨λ“  collectionμ—μ„œ μ°Ύμ•„μ„œ μˆ˜μ • ν•΄μ•Ό λ˜μ„œ 많이 느렀질 수 μžˆλ‹€.
  • Reference Pattern
    • Mysql 기본적인 κ΄€κ³„ν˜•μ²˜λŸΌ κ΅¬ν˜„ ν• λ•Œ μ“°λŠ” 방식
    • κ΄€κ³„ν˜• μ“°λŠ” μˆœκ°„ λΆ€ν„° NoSQL μ“°λŠ” 이유λ₯Ό 생각 해봐야 할것 κ°™λ‹€.

πŸ“Œ join

  • μ›λž˜ μ—†μ—ˆμ§€λ§Œ μ΅œκ·Όμ— 생겼닀 aggregate!!
//μ™ΈλΆ€ collection
db.inventory.insert([
 { "_id" : 1, "sku" : "almonds", "description": "product 1", "instock" : 120 },
 { "_id" : 2, "sku" : "bread", "description": "product 2", "instock" : 80 },
 { "_id" : 3, "sku" : "cashews", "description": "product 3", "instock" : 60 },
 { "_id" : 4, "sku" : "pecans", "description": "product 4", "instock" : 70 },
 { "_id" : 5, "sku": null, "description": "Incomplete" },
 { "_id" : 6 }
])

//λ‚΄λΆ€ collection
db.orders.insert([
   { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 },
   { "_id" : 3  }
])

//쿼리문
db.orders.aggregate([
   {
     $lookup:
       {
         from: "inventory",
         localField: "item",
         foreignField: "sku",
         as: "inventory_docs"
       }
  }
])

//κ²°κ³Όλ¬Ό
{
   "_id" : 1,
   "item" : "almonds",
   "price" : 12,
   "quantity" : 2,
   "inventory_docs" : [
      { "_id" : 1, "sku" : "almonds", "description" : "product 1", "instock" : 120 }
   ]
}
{
   "_id" : 2,
   "item" : "pecans",
   "price" : 20,
   "quantity" : 1,
   "inventory_docs" : [
      { "_id" : 4, "sku" : "pecans", "description" : "product 4", "instock" : 70 }
   ]
}
{
   "_id" : 3,
   "inventory_docs" : [
      { "_id" : 5, "sku" : null, "description" : "Incomplete" },
      { "_id" : 6 }
   ]
}

reference:

πŸ“Œ κ·Έμ™Έ ν”„λ‘œμ νŠΈ ν•˜λ©΄μ„œ 느꼈던 점

  • ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ schemaλ₯Ό 자주 λ°”κΎΈκ²Œ λ˜μ—ˆλŠ”λ° μ΄λ•Œ mongodb의 schema μœ μ—°ν•¨μ„ λͺΈμ†Œ 느끼게 λ˜μ—ˆλ‹€.
  • embedded + subset λ°©μ‹μœΌλ‘œ μ‚¬μš© ν• λ €λ‹€ λ³΄λ‹ˆκΉ 쀑볡 데이터λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜κ±°λ‚˜ μˆ˜μ • ν•΄μ•Ό ν• λ•Œ sql보닀 쿼리문을 더 μ§œμ•Ό λ˜μ„œ λΆˆνŽΈν–ˆλ˜ 점이 μžˆμ—ˆλ‹€.

Clone this wiki locally