티스토리 뷰
728x90
BSON(Binary JSON)
- JSON과 유사한 문서를 바이너리 형태로 인코딩한 데이터 포맷
- 날짜 타입, BinData 타입 등 JSON보다 많은 타입을 지원
- Protocol Buffer, Thrift와 같은 바이너리 교환 형식(Binary Interchange Format)
- BSON은 Protocol Buffer 대비 schema-less 하여 유연하다는 장점이 있지만, 직렬화된 데이터의 필드명에 대한 오버헤드가 있어 공간 효율성 면에서 약간의 단점이 있다
특징
- 가볍다
- 쉬운 데이터 순회 (Traversable)
- 타입과 길이 정보를 인코딩하여 순회를 빠르게 할 수 있다
- 효율적이다
- 문서 맨 앞에 길이 정보를 포함하고 있어 빠르게 스캔 및 쿼리 가능
- C언어의 데이터 타입을 사용하기 때문에 대부분의 프로그래밍 언어에서 인코딩과 디코딩이 빠르다
MongoDB가 BSON을 사용하는 이유
- JSON은 데이터 타입이 제한적이다. 날짜 및 이진 데이터에 대한 지원이 특히 부족하다.
- JSON 객체 및 property에는 고정 길이가 없다. 이는 순회를 느리게 만든다.
JSON을 우선시 하면서도 높은 성능을 올리기 위해 BSON이 고안되었다.
JSON vs BSON
JSON | BSON | |
타입 | 텍스트 포맷 | 바이너리 포맷 |
속도 | 빠른 읽기, 느린 빌드 | 느린 읽기, 빠른 빌드와 스캔 |
공간 | 약간 작은 바이트 사이즈 | 약간 큰 바이트 사이즈 |
인코딩 / 디코딩 | 인코딩 디코딩 없이 API를 통해 전송 가능 | - 데이터를 저장하기 전 인코딩 필요. - 데이터를 디스플레이 하기 전 디코딩 필요. |
파싱 | 사람이 읽을 수 있어 파싱이 필요하지 않음 | 기계만 읽을 수 있기 때문에 파싱이 필요함 |
데이터 타입 | String, Boolean, Number, Array, Object, null | String, Boolean, Number (Integer, Float, Long, Decimal128...), Array, null, Date, BinData |
가독성 | 인간, 기계 | 기계 전용 |
사용법 | API 등의 네트워크 송수신 | 데이터베이스에 데이터 저장하기 |
BSON 샘플
{"hello": "world"} →
\\x16\\x00\\x00\\x00 // total document size
\\x02 // 0x02 = type String
hello\\x00 // field name
\\x06\\x00\\x00\\x00world\\x00 // field value
\\x00 // 0x00 = type EOO ('end of object')
{"BSON": ["awesome", 5.05, 1986]} →
\\x31\\x00\\x00\\x00
\\x04BSON\\x00
\\x26\\x00\\x00\\x00
\\x02\\x30\\x00\\x08\\x00\\x00\\x00awesome\\x00
\\x01\\x31\\x00\\x33\\x33\\x33\\x33\\x33\\x33\\x14\\x40
\\x10\\x32\\x00\\xc2\\x07\\x00\\x00
\\x00
\\x00
참고자료
728x90
'Database' 카테고리의 다른 글
Redis DataType 간단 정리 (1) | 2023.05.13 |
---|---|
[MongoDB] Schema Design Pattern (0) | 2023.01.21 |
[MongoDB] 샤딩 전략 - Ranged Sharding, Hash Sarding, Zone Sharding (0) | 2023.01.19 |
[MongoDB] Sharded Cluster (0) | 2023.01.17 |
[MongoDB] Replica Set (0) | 2023.01.15 |
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- phpUnit
- laravel
- kubernetes
- mongoDB
- 라라벨
- springboot
- 쿠버네티스
- java
- 백엔드
- 샤드
- 대규모 데이터 처리
- mockery
- index
- 주니어개발자
- NoSQL
- laravel 테스트
- pods
- docker
- laravel 테스트코드
- 몽고디비
- 도커
- 분산처리
- 리눅스 컨테이너
- redis
- Apache POI
- k8s
- php
- MySQL
- 샤딩
- database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함