연결된 포스팅이다 이전 글을 참고하라. 스키마 설계 고려 사항 데이터 embed 방식과 참조 방식 중 결정하기 최적화를 위한 팁 - (현재지점) 일관성 고려 사항 스키마 마이그레이션 방법 스키마 관리 방법 몽고 DB가 데이터 스토리지로 적합하지 않은경우 데이터 조작을 위한 최적화 애플리케이션을 최적화하려면 읽기와 쓰기 성능을 분석하여 어느 것이 병목을 일으키는지 먼저 판단해야한다. 읽기 최적화 : 올바른 인덱스를 사용하여 하나의 도큐먼트에서 최대한 많은 정보를 반환. 쓰기 최적화 : 보통 갖고 있는 인덱스 개수를 최소화하고 갱신을 가능한 한 효율적으로 수행 아주 강한 트레이드 오프를 갖고 있는 것이 느껴진다. 따라서 당신이 구현하고자 하는 애플리케이션의 Read Write비율을 미리 예측하고 이를 통해 ..
연결된 포스팅이다 이전 글을 참고하라. 스키마 설계 고려 사항 데이터 embed 방식과 참조 방식 중 결정하기 - (현재지점) 최적화를 위한 팁 일관성 고려 사항 스키마 마이그레이션 방법 스키마 관리 방법 몽고 DB가 데이터 스토리지로 적합하지 않은경우 정규화 및 비정규화 정규화 : 각 컬렉션 간의 참조를 이용해 여러 컬렉션으로 나누는 작업 비정규화 : 모든 데이터를 하나의 도큐먼트에 내장 비 정규화는 정보가 갱신되면 여러 도큐먼트가 갱신되야하지만, 하나의 쿼리로 모든 데이터를 가져올 수 있음을 뜻한다. 따라서 정규화는 RDBMS를 설계하는 방법과 매우 유사하며, 비정규화는 MongoDB의 특색을 잘 표현한다. 아래는 정규화스러운 데이터 표현 예제이다. db.studentClasses.findOne({"..

연결된 포스팅이다 이전 글을 참고하라. 스키마 설계 고려 사항 - (현재지점) 데이터 embed 방식과 참조 방식 중 결정하기 최적화를 위한 팁 일관성 고려 사항 스키마 마이그레이션 방법 스키마 관리 방법 몽고 DB가 데이터 스토리지로 적합하지 않은경우 스키마 설계 패턴 아래와 같이 다양한 패턴이 존재한다. 다형성 패턴(Polymorphic pattern) 속성 패턴(Attribute pattern) 버킷 패턴(Bucket pattern) 이상치 패턴(Outlier pattern) 계산된 패턴 (Computed pattern) 서브셋 패턴(Subset pattern) 확장된 참조 패턴(Extended Reference pattern) 근사 패턴(Approximation pattern) 트리 패턴(Tree..
트랜잭션은 읽기나 쓰기 작업이 가능한 데이터베이스 작업을 하나 이상 포함하는 데이터베이스의 처리 단위이다. 트랜잭션의 중요한 특징은 작업이 성공하든 실패하든 부분적으로 완료되지 않는 점이다. (중도 실패시 롤백) 따라서 진정한 트랜잭션이 되려면 ACID 속성을 만족해야한다. Atomicity - 원자성 Consistency - 일관성 Isolation - 고립성 Durability - 영속성 몽고 DB는 이를 만족한다.
MongoDB에서는 무조건 인덱싱을 사용하는 것은 옳지 않다. 데이터의 일부를 조회할 때 가장 효율적이며 어떤 쿼리는 인덱스가 없는게 더 빠르다. 인덱스는 컬렉션에서 가져와야 하는 부분이 많을 수록 비효율 적이다. 왜냐면 인덱스를 하나 사용하려면 두 번의 조회를 해야하기 때문이다. 아쉽게도 인덱스가 도움이 될지 혹은 방해가 될지 알 수 있는 공식은 없다. 실제 데이터 크기 인덱스 크기 도큐먼트 크기 결과 셋 평균 크기 에 따라 다르기 때문이다. 쿼리의 30% 이상을 반환하는 경우 인덱스는 종종 쿼리 속도를 높인다. 하지만 이 수치는 2% ~ 60% 까지 다양한 양상을 띈다. 인덱스가 적합한 경우 큰 컬렉션 큰 도큐먼트 선택적 쿼리 컬랙션 스캔이 적합한 경우 작은 컬렉션 작은 도큐먼트 비선택적 쿼리 인덱스..

인덱스를 사용하면 빠른 속도로 쿼리할 수 있다. 인덱스를 사용하지 않는 쿼리를 Collection scan이라 하며, 서버가 컬렉션 전체를 뒤져 결과를 가져오는 것을 의미한다. 몽고 DB가 쿼리에 효율적으로 응답하게 하려면 애플리케이션의 모든 쿼리 패턴에 인덱스를 사용하는 것이 좋다. 인덱스는 조회 영역에 한하여 놀라운 차이를 가져오지만, 인덱싱된 필드를 변경하는 CRUD 중 CUD 작업은 모든 인덱스를 갱신하기 때문에 오래걸린다. 몽고 DB 인덱스는 기존 RDBMS와 거의 동일하게 작동한다. 예제를 살펴보자. 아래와 같이 쿼리를 진행한다고 하자, db.users.find().sort({"age" : 1, "username" : 1}) 위 쿼리는 먼저 age로 정렬한 뒤, username으로 정리하는데 ..

AND 조건 db.user.find({"username" : "joe", "age" : 27}) 반환받을 Key 지정 db.users.find({}, {"username" : 1, "email" : 1}) 아래와 같은 결과를 리턴한다. { "_id" : ObjectId("오브젝트아이디), "username" : "joe", "email" : "joe@example.com" } _id의 경우 설정하지 않더라도 반환된다. db.users.find({"username" : 1, "_id" : 0}) 위와 같이 쿼리를 작성하면 _id는 나오지 않는다. 제약사항 mongoDB에서는 c언어와 동일하게 0이 아닌 다른 수는 모두 TRUE로 처리한다. db.users.find({}, {"fatal_weakness" :..

디비 확인 show dbs 컬렉션 확인 show collections 데이터 생성 db.movies.insertOne({"title" : "Stand by Me"}) 데이터 확인 db.moives.find() 컬렉션 삭제 db.movies.drop() 다중 데이터 생성 db.movies.insertMany([{"title" : "Ghostbuster"}, {"title" : "E.T."}, {"title" : "Blade Runner"}]); 조회 결과 여러 도큐먼트를 단일 컬렉션에 삽입하는데 매우 유용 얼마까지 데이터를 입력할 수 있는가? - 책 필자는 48MB 라고 언급 하지만 현재 실습환경 MongoDB 6.X 버전은 아래와 같음 MongoDB 6.X 버전의 임계 값 현재는 해당링크 에 100,00..
//.mongorc.js var comliment = ["attractive, "intelligent", "like Batman"]; var index = Math.floor(Math.random()*3); print("Hello, you're looking particularly " +compliment[index]+ " today!"); var no = function() { print("Not on my watch."); }; //데이터베이스 삭제 방지 db.dropDatabase = DB.prototype.dropDatabase = no; //컬렉션 삭제 방지 DBCollection.prototype.drop = no; //인덱스 삭제 방지 DBCollection.prototype.dropInde..
본 포스팅은 아래 책을 학습한 과정을 담고 있습니다. https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=268367408 [전자책] MongoDB 완벽 가이드 몽고DB 입문자를 위한 기초부터 실제 배포에 적용할 수 있는 실용적이고 깊이 있는 내용까지 담았다. 개정 3판에서는 성능이 강화된 몽고DB 최신 버전을 반영해 복제와 샤딩을 더 깊이 다루며 개 www.aladin.co.kr 이번에 신규로 진행하는 프로젝트는 Notion, Google Sheet와 같은 Wiki Product 적인 성향을 띄고 있었고, 기존 RDBMS만으로는 문서형식의 데이터를 저장하기에 까다로운 측면이 있었습니다. 기존 MySQL, Maria, Postgres 등을 사용하여 "커뮤니티"와 같..