n324_NoSQL

ssu_hyunΒ·2021λ…„ 10μ›” 2일
0

[codestates] AI Bootcamp

λͺ©λ‘ 보기
32/62

#NoSQL #JSON #MongoDB #Pymongo

πŸ† ν•™μŠ΅ λͺ©ν‘œ

  • NoSQL이 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ²˜λŸΌ ν•˜λ‚˜λ‘œ μ •μ˜λœ μš©μ–΄κ°€ μ•„λ‹ˆλΌλŠ” 것을 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.
  • NoSQL이 μ—¬λŸ¬ μ’…λ₯˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ κ΅¬μ„±λœλ‹€λŠ” 것을 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.
  • NoSQL에 데이터λ₯Ό μž…λ ₯ν•  쀄 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.
  • NoSQL에 μž…λ ₯된 데이터λ₯Ό 좜λ ₯ν•  쀄 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.



NoSQL


λ“±μž₯λ°°κ²½ : Web, Cluster

  • NoSQL 은 2000λ…„λŒ€ 초 μ›Ή ν™˜κ²½μ—μ„œ λ°œμƒν•˜λŠ” 데이터λ₯Ό 닀루기 μœ„ν•΄ 많이 μ‚¬μš©λ¨
  • Web μ‹œμž₯의 λ°œμ „κ³Ό ν•¨κ»˜ 데이터 μ†ŒμŠ€μ™€ λ°μ΄ν„°μ˜ 양이 ν­νŒ”μ μœΌλ‘œ μ¦κ°€ν•˜κΈ° μ‹œμž‘
  • μ›Ή μ„œλΉ„μŠ€μ˜ 데이터 μ²˜λ¦¬λŠ” λŒ€ν‘œμ μœΌλ‘œ xml, json으둜 μ²˜λ¦¬λ˜λŠ”λ° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ²˜λ¦¬ν•˜κΈ°μ—λŠ” 데이터 μ„€κ³„μ‹œκ°„μ΄ 였래걸리기 μ‹œμž‘
  • ν•˜λ‚˜μ˜ μ„œλ²„λ₯Ό 크게 λ§Œλ“œλŠ” 것보닀, μ—¬λŸ¬κ°œμ˜ μ„œλ²„λ₯Ό μ—°κ²°μ‹œμΌœ ν™•μž₯ν•˜λŠ” 방법이 더 λΉ„μš©μ— 절감되기 μ‹œμž‘ν–ˆλ‹€. (μˆ˜μ§ν™•μž₯ -> μˆ˜ν‰ν™•μž₯)

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDB) vs. NoSQL(λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€)


κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDB)NoSQL(λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€)
μ €μž₯ 정보 μ’…λ₯˜κ³ μ •λœ λ°μ΄ν„°λ² μ΄μŠ€κ³ μ •λ˜μ–΄ μžˆμ§€ μ•Šμ€ λ°μ΄ν„°λ² μ΄μŠ€
데이터 μ €μž₯(Storage)- SQL을 μ΄μš©ν•΄μ„œ 데이터λ₯Ό ν…Œμ΄λΈ”μ— μ €μž₯
- 미리 μž‘μ„±λœ μŠ€ν‚€λ§ˆλ₯Ό 기반으둜 정해진 ν˜•μ‹μ— 맞게 데이터λ₯Ό μ €μž₯ν•΄μ•Ό ν•œλ‹€.(JSON νŒŒμ‹±)
- ν•˜λ‚˜μ˜ instance : ν•˜λ‚˜μ˜ κ°’ (ex. 학생:name)
- key-value (Redis, Dynamo)
: 데이터λ₯Ό Key-Value의 μŒμ„ μ†μ„±μœΌλ‘œ ν•˜λŠ” λ°°μ—΄ ν˜•νƒœλ‘œ _id값을 무쑰건 가지며 이 값은 μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” κ³ μœ κ°’μ΄λ‹€.
- document (MongoDB)
: JSON μœ μ‚¬ ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό λ¬Έμ„œν™”
- graph
- wide-column (Cassandra, HBase)
: λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—΄(column)에 λŒ€ν•œ 데이터 관리λ₯Ό μ§‘μ€‘ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€
- ν•˜λ‚˜μ˜ instance : μ—¬λŸ¬ κ°’ (ex. queen: [name, age, height])
μŠ€ν‚€λ§ˆ(Schema)- ν˜•μ‹μ΄ κ³ μ •λœ μŠ€ν‚€λ§ˆ ν•„μš”
(데이터 μ†μ„±λ³„λ‘œ μ—΄(column)에 λŒ€ν•œ 정보가 미리 μ •ν•΄μ Έμ•Ό ν•œλ‹€λŠ” 의미)
- 데이터λ₯Ό μ“Έ λ•Œ μŠ€ν‚€λ§ˆμ— 맞좀
- μŠ€ν‚€λ§ˆκ°€ 뚜렷이 보인닀
(ν…Œμ΄λΈ” κ°„ 관계가 잘 보인닀)
- 동적인 μŠ€ν‚€λ§ˆ ν˜•νƒœ
(행을 μΆ”κ°€ν•  λ•Œ μ¦‰μ‹œ 열을 ν•¨κ»˜ μΆ”κ°€ν•  수 있고,
κ°œλ³„ 속성에 λŒ€ν•΄μ„œ λͺ¨λ“  열에 λŒ€ν•œ 데이터λ₯Ό λ°˜λ“œμ‹œ μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ 됨)
- 데이터λ₯Ό μ½μ–΄μ˜¬ λ•Œ μŠ€ν‚€λ§ˆμ— 따라 μ½μ–΄μ˜΄
쿼리(Querying)
(λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•΄μ„œ 정보λ₯Ό μš”μ²­ν•˜λŠ” 행동)
- SQL(κ΅¬μ‘°ν™”λœ 쿼리 μ–Έμ–΄)을 톡해 데이터 및 정보 μš”μ²­μ— μ‚¬μš©
- UnQL(UnStructured Query Language;ꡬ쑰화 λ˜μ§€ μ•Šμ€ 쿼리 μ–Έμ–΄)λ‘œλ„ 데이터 μš”μ²­ κ°€λŠ₯
ν™•μž₯μ„±(Scalability)- 수직적 ν™•μž₯
(높은 λ©”λͺ¨λ¦¬, CPU μ‚¬μš© ν™•μž₯)
- λ§Žμ€ λΉ„μš©κ³Ό μ‹œκ°„ μ†Œλͺ¨
- μˆ˜ν‰μ  ν™•μž₯
(보닀 κ°’μ‹Ό μ„œλ²„ 증섀, λ˜λŠ” ν΄λΌμš°λ“œ μ„œλΉ„μŠ€ μ΄μš©ν•˜λŠ” ν™•μž₯)보닀 κ°’μ‹Ό μ„œλ²„ 증섀, λ˜λŠ” ν΄λΌμš°λ“œ μ„œλΉ„μŠ€ μ΄μš©ν•˜λŠ” ν™•μž₯- λΉ„μš© νš¨μœ¨μ„± λ†’μŒ
예- MySQL
- Oracle
- SQLite
- PostgresSQL
- MariaDB
- MongoDB(Document)
- DynamoDB(Key-value)
μ‚¬μš© μΌ€μ΄μŠ€- λ°μ΄ν„°λ² μ΄μŠ€μ˜ ACID μ„±μ§ˆμ„ μ€€μˆ˜ν•΄μ•Ό ν•˜λŠ” 경우
(μ „μž μƒκ±°λž˜, 금육 μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 개발)
- μ†Œν”„νŠΈμ›¨μ–΄μ— μ‚¬μš©λ˜λŠ” 데이터가 ꡬ쑰적이고 일관적인 경우
- λ°μ΄ν„°μ˜ ꡬ쑰가 거의 λ˜λŠ” μ „ν˜€ μ—†λŠ” λŒ€μš©λŸ‰μ˜ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 경우
- ν΄λΌμš°λ“œ μ»΄ν“¨νŒ… 및 μ €μž₯곡간을 μ΅œλŒ€ν•œ ν™œμš©ν•˜λŠ” 경우
- λΉ λ₯΄κ²Œ μ„œλΉ„μŠ€λ₯Ό κ΅¬μΆ•ν•˜κ³  데이터 ꡬ쑰λ₯Ό 자주 μ—…λ°μ΄νŠΈ ν•˜λŠ” 경우



MongoDB

Document Databases

λ¬Έμ„œν˜•(Document) λ°μ΄ν„°λ² μ΄μŠ€
데이터λ₯Ό ν…Œμ΄λΈ”μ΄ μ•„λ‹Œ λ¬Έμ„œμ²˜λŸΌ μ €μž₯ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. JSON μœ μ‚¬ ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό λ¬Έμ„œν™”ν•˜λŠ” 것이 λ³΄ν†΅μž…λ‹ˆλ‹€. 각각의 λ¬Έμ„œλŠ” ν•˜λ‚˜μ˜ 속성에 λŒ€ν•œ 데이터λ₯Ό 가지고 있고, μ»¬λ ‰μ…˜μ΄λΌκ³  ν•˜λŠ” 그룹으둜 λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ λ¬Έμ„œν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” MongoDBκ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • Documents듀은 BSON(Binary JSON) ν˜•νƒœλ‘œ μ €μž₯
  • 정해진 ν‹€μ΄λ‚˜ 데이터 νƒ€μž…μ΄ μ—†μ–΄ 자유둭게 문자, 숫자, 객체, λ°°μ—΄ 등을 μ €μž₯ν•  수 μžˆλ‹€.
  • 사전에 μ •μ˜λœ ν…Œμ΄λΈ” ν•„λ“œλ‚˜ 관계(μŠ€ν‚€λ§ˆ)에 맞좰 ν•  ν•„μš” 없이 데이터 μΆ”κ°€
  • 각 λ¬Έμ„œ μ €μž₯ μ‹œ, 자유둭게 μ €μž₯ κ°€λŠ₯ν•˜λ‚˜ 자유둭게 μ €μž₯ν•˜λŠ” 만큼 μ½μ–΄μ˜¬ λ•Œμ— μΌμ’…μ˜ μŠ€ν‚€λ§ˆκ°€ μžˆμ–΄μ•Ό μˆ˜μ›”ν•˜κ²Œ κ°€μ Έμ˜¬ 수 μžˆλ‹€.
  • SQLμ—μ„œλŠ” 각 ν…Œμ΄λΈ”μ„ 생성할 λ•Œμ—, 그리고 각 ν…Œμ΄λΈ”μ˜ 관계듀을 사전에 μ •μ˜ν•  λ•Œμ— μŠ€ν‚€λ§ˆλ₯Ό μ •ν–ˆμ§€λ§Œ NoSQL μ—μ„œλŠ” 데이터λ₯Ό 읽을 λ•Œμ— νŠΉμ • 'μŠ€ν‚€λ§ˆ'에 따라 데이터λ₯Ό λΆˆλŸ¬μ™€μ•Ό ν•˜κΈ°λ„ ν•œλ‹€.
  • μΌκ΄€λ˜μ§€ μ•Šμ€ 데이터듀을 μΆ”κ°€ν•΄μ•Όν•˜κ±°λ‚˜ ν˜Ήμ€ 재빠λ₯΄κ²Œ 데이터λ₯Ό μŒ“μ•„μ•Ό ν•  λ•Œ μ‚¬μš© (데이터 μ μž¬μ— 초점)

MongoDB Atlas

  1. Organization 생성 - Project 생성 - Database 생성
  2. IP μ£Όμ†Œ, Username, Password μ„€μ •
  3. Cluster connect
  4. pymongo 톡해 μ—°κ²°
### νŒ¨ν‚€μ§€ μ„€μΉ˜
pip install pymongo
pip install dnspython


### import
from pymongo import MongoClient

### client 객체 ν˜•μ„±ν•˜μ—¬ MongoDB와 μ—°κ²°
# URI/톡합 μžμ› μ‹λ³„μž ν˜•μ‹ : mongodb+srv://{μœ μ € 이름}:{μœ μ € λΉ„λ°€λ²ˆν˜Έ}@cluster-prac.hubjn.mongodb.net/{κΈ°λ³Έ λ°μ΄ν„°λ² μ΄μŠ€ 이름}?retryWrites=true&w=majority
URI = "mongodb+srv://shuser:rRawtPfp7t9J2Wvh@cluster0.8dwi3.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"
client = MongoClient(URI)

### client 객체의 field둜 λ°μ΄ν„°λ² μ΄μŠ€ 생성/선택
DATABASE = 'myFirstDatabase'  # λ°μ΄ν„°λ² μ΄μŠ€ 이름
database = client[DATABASE]

### λ°μ΄ν„°λ² μ΄μŠ€μ˜ collection μ‘°μž‘
COLLECTION = 'sh-collection'  # μ»¬λ ‰μ…˜ 이름
collection = database[COLLECTION]

### collection에 document μ‚½μž… : 'JSON' ν˜•νƒœλ‘œ μΆ”κ°€
# _id:ObjectId("고유번호") 톡해 각 λ¬Έμ„œμ— 고유번호 λΆ€μ—¬ν•˜μ—¬ ꡬ뢄 (κ³ μœ λ²ˆν˜ΈλŠ” λ³€κ²½ κ°€λŠ₯ν•˜λ‚˜ μ€‘λ³΅λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€.)
collection.insert_one(document = {"hello":"suhyun"})
collection.insert_one(document = {"today":"first day of mongodb"})
doc_1 = collection.list()
doc_2 = collection.find_one()
print(doc_1)
print(doc_2)



+Ξ±+\alpha

  • "MongoDB local Install" : ν΄λΌμš°λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 λ§Žμ€κ±Έ 숨기고 μžˆμŠ΅λ‹ˆλ‹€. Local 에 μ„€μΉ˜ν•΄λ³΄κ³  μ–΄λ–€ λ¬Έμ œκ°€ μžˆλŠ”μ§€ ν™•μΈν•΄λ³ΌκΉŒμš”?
  • "MongoDB Cluster" : ν΄λŸ¬μŠ€ν„° κ°œλ…μ€ ν•œλ°œμ§ μ•žμœΌλ‘œ λ‚΄λ”›λŠ”κ²Œ μ–΄λ €μš°μ‹€ κ²λ‹ˆλ‹€. λ‹€μ–‘ν•œ 컴퓨터과학(CS) 적 사고가 ν•„μš”ν•©λ‹ˆλ‹€.
  • "CF NoSQL" : Wide Column ν˜Ήμ€ Column Family 라고 λΆˆλ¦¬λŠ” NoSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ–΄λ–€ μ’…λ₯˜κ°€ μžˆμ„κΉŒμš”?

0개의 λŒ“κΈ€