Skip to content

MongoDB

gyim1345 edited this page Dec 19, 2020 · 5 revisions
  • 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
      • collectionλ‚΄μ˜ 각 DocumentλŠ” μŠ€ν‚€λ§ˆκ°€ μ—†κ±°λ‚˜ λ‹€λ₯Ό 수 μžˆλ‹€. (rdbms λŠ” schema λ₯Ό λ³€κ²½μ‹œ λͺ¨λ“  데이터λ₯Ό λ³€κ²½ ν•΄μ•Ό ν•˜μ§€λ§Œ nosql은 κ·Έλ ‡μ§€ μ•Šλ‹€.)
      • joinless λŒ€μ‹  고속 crud query
      • Scalability(ν™•μž₯μ„±)이 μ’‹κ³  Sharding(db λΆ„ν•  기술)ν΄λŸ¬μŠ€ν„° ꡬ좕 이 κ°€λŠ₯ν•˜λ‹€
    • κ³΅μ‹λ¬Έμ„œ(https://www.mongodb.com/nosql-explained/advantages)
      • μŠ€μΌ€μΌ 아웃 μ•„ν‚€ν…μ²˜λ‘œ λŒ€λŸ‰μ˜ 데이터λ₯Ό κ³ μ†μœΌλ‘œ 처리 (scalability/sharding)
        • μƒˆ 컴퓨터와 μŠ€ν† λ¦¬μ§€λ₯Ό ν΄λŸ¬μŠ€ν„°μ— μ‰½κ²Œ μΆ”κ°€ ν•  μˆ˜μžˆλŠ” ν΄λΌμš°λ“œ μ»΄ν“¨νŒ… ν™˜κ²½μ—μ„œ κ΅¬ν˜„ν•˜λŠ” 데 특히 어렀움이 μ—†λ‹€.
        • NoSQL μ‹œμŠ€ν…œμ˜ μˆ˜ν‰ ν™•μž₯ μ•„ν‚€ν…μ²˜λŠ” 데이터 λ³Όλ₯¨μ΄λ‚˜ νŠΈλž˜ν”½μ΄ 증가 ν•  λ•Œ ν™•μž₯성에 λŒ€ν•œ λͺ…ν™•ν•œ 경둜λ₯Ό μ œκ³΅ν•œλ‹€. SQL λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ™μΌν•œ μœ ν˜•μ˜ ν™•μž₯ 성을 λ‹¬μ„±ν•˜λ €λ©΄ λΉ„μš©μ΄ 많이 λ“€κ±°λ‚˜ λ§Žμ€ μ—”μ§€λ‹ˆμ–΄λ§μ΄ ν•„μš”ν•˜κ±°λ‚˜ μ‹€ν–‰ λΆˆκ°€λŠ₯ν•  수 μžˆλ‹€
          • μˆ˜ν‰ ν™•μž₯은 더 λ§Žμ€ μ‹œμŠ€ν…œ 을 μΆ”κ°€ν•˜μ—¬ ν™•μž₯
          • 수직 ν™•μž₯은 κΈ°μ‘΄ μ‹œμŠ€ν…œμ— 더 λ§Žμ€ μ „λ ₯ (CPU, RAM)을 μΆ”κ°€ν•˜μ—¬ ν™•μž₯.
      • λΉ„ ꡬ쑰적, 반 ꡬ쑰적 λ˜λŠ” ꡬ쑰적 데이터 μ €μž₯ (μœ μ—°μ„±)
        • 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