ํค์๋ : NoSQL, JSON, MongoDB, Pymongo
NoSQL
๋จ์ด ์ ๋ : ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB)๋ ํ๋์ ๊ณตํต๋ ํน์ฑ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ฑ์ ๋ฐ๋ผ ๋ถ๋ฅ๊ฐ ๋๋ ๋ฐ๋ฉด NoSQL์ ๋ง๊ทธ๋๋ก 'SQL์ด ์๋๋ค'์ ์๋ฏธ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ธ์ด์ ๋๋ค. ์ฆ, NoSQL์ DB๋ง๋ค ์์ ๋ค๋ฅด๋ค๊ณ ํ ์ ๋๋ก ์ฐจ์ด๊ฐ ํฝ๋๋ค.
๋ฑ์ฅ ๋ฐฐ๊ฒฝ : 2000๋
๋ ์ด๋ฐ ์น์ ๋ฐ์ ์ ๋ฐ๋ผ ์น์์ ๋ฐ์ํ๋ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๋ฐ์ ํ๊ธฐ ์์ํ์ต๋๋ค.
์น ํ๊ฒฝ์ด ๋๋๋๊ธฐ ์์ํ ๋ฐ์ดํฐ๋ค์ ํน์ฑ
- ์์ค์ ๋ฐ์ดํฐ์ ์์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐ
- ์น ์๋น์ค์ ๋ฐ์ดํฐ๋ xml, json์ผ๋ก ์ฒ๋ฆฌ๋๋๋ฐ RDB๋ก ์ฒ๋ฆฌํ๊ธฐ์ ๋ฐ์ดํฐ ์ค๊ณ์๊ฐ(์คํค๋ง ๊ตฌ์กฐ๋ฅผ ์ง๋ ๋ฑ)์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ์์
- ํ๋์ ์๋ฒ๋ฅผ ํค์ฐ๋ ๊ฒ(์์งํ์ฅ)๋ณด๋ค ์ฌ๋ฌ๊ฐ์ ์๋ฒ๋ฅผ ์ฐ๊ฒฐ์์ผ ํ์ฅํ๋ ๋ฐฉ๋ฒ(์ํํ์ฅ)์ด ๋น์ฉ๋๋น ํผํฌ๋จผ์ค์์ ์ฐ์๋ฅผ ์ฐจ์ง
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ; SQL vs ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ; NoSQL
๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ex) MYSQL, Oracle, SQLite, PostgreSQL, MariaDB
- ํ ์ด๋ธ์ ์ฌ์ ์ ์ ์ํ๊ณ ์ง์ฌ์ง ๊ตฌ์กฐ์ ๋ง๊ฒ ํ๊ณผ ์ด์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ํ์๋ ํ๋์ ์์ฑ์ ๋ํ ์ ๋ณด, ์ด์๋ ๊ฐ๊ฐ์ ํ์์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ํน์ ํ ํ์์ ๋๊ณ ์ ์ฅํ๊ธฐ์ ๊บผ๋ผ ๋ ์์ -> SQL์ ํตํด ์ฟผ๋ฆฌ๋ฌธ์ ์ธ ์ ์์ต๋๋ค.
- ์์งํ์ฅ(๋ฉ๋ชจ๋ฆฌ ๋ฐ CPU๋ฅผ ํ์ฅ), ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ตฌ์ถ๋ ํ๋์จ์ด์ ์ฑ๋ฅ์ ๋ง์ด ์ด์ฉํ๋ฏ๋ก ๊ณ ๋น์ฉ, ์ฌ๋ฌ ์๋ฒ์ ๊ฑธ์ณ์ DB์ ๊ด๊ณ๋ฅผ ์ ์ํ ์ ์์ง๋ง ๋งค์ฐ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ์๋ชจ๋ฉ๋๋ค.
๋น๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ex) MongoDB, CouchDB, ์นด์ฐ๋๋ผ, DynamoDB ๋ฑ ๊ต์ฅํ ๋ค์ํ๊ณ ์๋ก ๊ต์ฅํ ๋ค๋ฆ
- ์คํค๋ง๊ฐ ์๋ DB๋ง๋ค Document, Key-Value, Wide-Column, Graph ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ์ฅ
- NoSQL๋ ์คํค๋ง๊ฐ ์กด์ฌ. ๋จ, ์ฝ์ด์ฌ ๋๋ง ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ฉฐ ์คํค๋ง์ ํํ๊ฐ ๋ณด๋ค ๋์ ์ ๋๋ค. ํ์ ์ถ๊ฐํ๋ฉด์ ๋์์ ์ด์ ์ถ๊ฐํ ์ ์๊ณ ๊ฐ๋ณ ์์ฑ์ ๋ํด์ ๋ชจ๋ ์ด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋์ ์ ๋ ฅํ์ง ์์๋ ๋๋ ์ฅ์ ๋ ์์ต๋๋ค.
- ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ทธ๋ฃน ์์ฒด๋ฅผ ์กฐํํ๋ ๊ฒ์ ์ด์ ์ ๋ก๋๋ค. ํด์ ๊ตฌ์กฐํ๋์ง ์์ ์ฟผ๋ฆฌ ์ธ์ด(UnQL ; Unstructured Query Language)๋ก๋ ๋ฐ์ดํฐ ์์ฒญ์ด ๊ฐ๋ฅ
- ์ํํ์ฅ(์๋์ ์ผ๋ก ์ ๋ ดํ ์๋ฒ ์ฆ์ค ๋๋ ํด๋ผ์ฐ๋ ์ด์ฉ), ๋ง์ ํธ๋ํฝ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ, ์๋์ ์ผ๋ก ๋น์ฉ ๋๋น ํจ์จ์ด ์ข์
SQL VS NoSQL
๋ ์ค ํ๋๋ง ์ฌ์ฉํ๊ธฐ๋ณด๋ค ๊ฐ ์ํฉ, ๋ถ์ผ์ ๋ฐ๋ผ ์ ์ฉํ๊ธฐ ์ข์ DB๊ฐ ์๊ธด ํฉ๋๋ค. ์ค์ ์ ์ผ๋ก๋ ์๋น์ค, ์ ์ ์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ๋ ๋ค ์ฌ์ฉํฉ๋๋ค.
SQL ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ข์ ๊ฒฝ์ฐ
DB์ ACID๋ฅผ ์ง์ผ์ผํ๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ์ผ์ด๋๋ ํ๋์ ์ํ ๋ณํ(transaction)์ ์์ ์ฑ์ ๋ณด์ฅ ์ฆ, ์ ์์๊ฑฐ๋ ๊ธ์ต ์๋น์ค๋ฅผ ์ํ ๊ฐ๋ฐ์์๋ SQL์ ์ด์ฉํ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๊ฐ ์ ํธ๋ฉ๋๋ค.์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๊ฐ ๊ตฌ์กฐ์ ๋ฐ ์ผ๊ด์ ์ธ ๊ฒฝ์ฐ
์ผ๊ด๋ ํ์ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์, ๊ตณ์ด NoSQL์ ์ฌ์ฉํ ํ์ X
NoSQL ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ข์ ๊ฒฝ์ฐ
์ ํด์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ฑฐ์ ํน์ ์์ ์๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ
NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์ ์ ํ์ ๋์ง ์์ผ๋ฏ๋ก ํ์์ ๋ฐ๋ผ ์๋ก์ด ์ ํ ์ถ๊ฐ ๊ฐ๋ฅ
๊ทธ๋ ๊ธฐ์ ์ ํํ๋์ง ์์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์ ์ ์ฉํด๋ผ์ฐ๋ ๋ฐ ์ ์ฅ๊ณต๊ฐ์ ์ต๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฅ์ฑ์ด ์ค์ํ๋ค๋ฉด ์ฌ๋ฌ ๋ฐ์ดํฐ ์ผํฐ๋ฅผ ๊ฑฐ์น๋ ๋ฒ๊ฑฐ๋ก์ ์์ด ํด๋ผ์ฐ๋๋ฅผ ํตํ ํ์ฅ์ด ์ ์ฉ๋น ๋ฅด๊ฒ ์๋น์ค๋ฅผ ๊ตฌ์ถ ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฃผ ๋ฐ๊ฟ์ผํ๋ ๊ฒฝ์ฐ
์ด๋ค ๊ฐ๋ฐ์ ํ ๋, RDB์ฒ๋ผ ๋ณต์กํ ์คํค๋ง๋ฅผ ๋ฏธ๋ฆฌ ์๊ฐํ๊ณ ์ ์ฉํ ํ์์์ผ๋ฏ๋ก ์ด๊ธฐ ๋จ๊ณ ํน์ ์์ ํ์ ๊ฐ๋ฐํ ๋ ์ ์ฉํฉ๋๋ค.
NoSQL ๋ํ ๋ชจ๋ธ
Document(๋ฌธ์ํ) Database
- ํ ์ด๋ธ์ด ์๋ ๋ฌธ์์ฒ๋ผ ์ ์ฅ
- JSON๊ณผ ์ ์ฌํ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์ํ
- ๊ฐ๊ฐ์ ๋ฌธ์๋ ํ๋์ ์์ฑ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ปฌ๋ ์ ์ด๋ผ๋ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ๊ด๋ฆฌ
- ๋ํ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค : MongoDB
Key-Value(KV) Database
- Key/Value์ ์์ ์์ฑ์ผ๋ก ํ๋ ๋ฐฐ์ด ํํ๋ก ์ ์ฅ
- Key : ์์ฑ ์ด๋ฆ, Value : ์์ฑ์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ ๊ฐ
- ๋ํ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค : RedisDB, DynamoDB
Wide-Column(WC) Database
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด(column)์ ์ง์คํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ
- ๊ฐ ์ด์ Key-Value ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ, ์ปฌ๋ผ ํจ๋ฐ๋ฆฌ(Column Families)๋ผ๋ ์ด์ ์งํฉ์ฒด ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ํ๋์ row์ ๋ง์ column์ ํฌํจํ ์ ์์
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ํ ์ด์ ์ ์ฐํ๊ฒ ์ ํํ ์ ์์ด, ๊ท๋ชจ๊ฐ ํฐ ๋ฐ์ดํฐ ๋ถ์์์ ์ฃผ๋ก ์ฌ์ฉ
- ๋ํ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค : Cassandra, Hbase
- ์ปฌ๋ผ ์์ ์ปฌ๋ผ๋ค์ด ์๋ ํํ
Graph Database
- ๋ ธ๋ : ์ถ์ ๋์์ด ๋๋ ์ฌ๋, ๊ธฐ์ , ๊ณ์ ๋ฑ์ ์ค์ฒด) == RDB์ ๋ ์ฝ๋, Document DB์ document
- ์ฃ์ง : ๊ทธ๋ํ๋ ๊ด๊ณ๋ผ๊ณ ๋ ํ๋ฉฐ, ๋ ธ๋๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์๋ ์
- ํ๋กํผํฐ : ๋ ธ๋์ ์ ๋ณด์ ๋ฐ์ ํ ๊ด๋ จ
MongoDB
Document Database
- ๋ฌธ์๋ค์ BSON(Binary jSON) ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์ ํด์ง ํ์ด๋ ๋ฐ์ดํฐ ํ์ ์ด ์๊ณ ์์ ๋กญ๊ฒ ๋ฌธ์, ์ซ์, ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ์ ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค.
- RDB ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์คํค๋ง๊ฐ ์๋ ๊ฒ์ ์๋์ง๋ง ์ฝ์ด์ฌ ๋ ํน์ ์คํค๋ง๋ฅผ ๋ฐ๋ผ ๋ถ๋ฌ์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
MongoDB Atlas ์์ ํด๋ฌ์คํฐ๋ฅผ ์์ฑ
Atals์์ ๋ชฉ์ ์ ํด๋ฌ์คํฐ ์์ฑ ํ URI, ์ ์ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ ๋ฑ์ ํ๋
Pymongo ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
HOST = 'Host'
USER = 'Username'
PASSWORD = 'Userpassword'
DATABASE_NAME = 'DBname'
COLLECTION_NAME = 'collection_name'
MONGO_URI = f"mongodb+srv://{USER}:{PASSWORD}@{HOST}/{DATABASE_NAME}?retryWrites=true&w=majority"
# URI = "mongodb+srv://{์ ์ ์ด๋ฆ}:{์ ์ ๋น๋ฐ๋ฒํธ}@cluster-prac.hubjn.mongodb.net/{๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ}?retryWrites=true&w=majority"
from pymongo import MongoClient
client = MongoClient(MONGO_URI)
database = client[DATABASE_NAME]
collection = database[COLLECTION_NAME]
collection.insert_one(document='dictํํ') # ๊ฐ์ ํ๋๋ง ๋ฃ์
collection.insert_many(documents='dict๊ฐ ์ฌ๋ฌ๊ฐ ์๋ ๋ฆฌ์คํธ ํํ') # ๊ฐ์ ์ฌ๋ฌ๊ฐ ๋ฃ์
collection.find() # MongoDB์ ์ฌ๋ ค์ง ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด
collection.find_one() # ํ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋
for data in collection.find(): # ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฐพ์ ๋
######################## ์ด๋ฐ ์์ผ๋ก ๊ฐ ๋ฐ์ดํฐ ๊ฐ์ for๋ฌธ์ ํตํด ๋ฝ์๋ด๋ ๋ฐฉ์์ผ๋ก ์์ฃผ ์ฌ์ฉ
์์ ๊ฐ์ด ํ์ฉํ๋ฉฐ, NoSQL์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ, ๋ฐ์์ค๋ ๋ฐฉ๋ฒ
๋ฐ์์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค์ RDB์ ๋ฃ๋ ๋ฐฉ๋ฒ ๋ฑ ๋ค์ํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]57.Docker (0) | 2022.02.05 |
---|---|
[TIL]56. Section3_Sprint2_Chall (0) | 2022.02.03 |
[TIL]54. API (0) | 2022.01.27 |
[TIL]53. Web_Scraping (0) | 2022.01.27 |
[TIL]52. Python_Intensive(Debuging, Class) (0) | 2022.01.26 |