BSON — JSONga o‘xshash documentlarni binary ko‘rinishda serialize qilish uchun yaratilgan format. To‘liq nomi Binary JSON. BSON object, array, string, son, boolean va null bilan birga qo‘shimcha binary hamda maxsus data turlarini saqlashi mumkin.
BSON MongoDB ecosystemi bilan keng bog‘langan, lekin formatning asosiy g‘oyasi structured documentni type ma’lumoti bilan binary shaklda ifodalashdir.
Document
BSONning asosiy birligi document.
Document key-value elementlardan tashkil topadi:
name → "Farrukh"
age → 30
active → true
Har element key nomi, type belgisi va qiymatga ega.
Document uzunligi binary headerda saqlanadi.
Binary tuzilma
BSON text format emas.
Byte oqimi odatda:
qismlaridan tashkil topadi.
Parser noto‘g‘ri uzunlik va type qiymatlarini qat’iy tekshirishi kerak.
JSON bilan o‘xshashlik
BSON logical jihatdan JSON document modeliga yaqin:
- object;
- array;
- string;
- boolean;
- null;
- number.
Biroq JSONning oddiy textida mavjud bo‘lmagan type’lar BSONda alohida saqlanadi.
Son turlari
JSON odatda “number” tushunchasiga ega.
BSON esa sonlarni bir nechta type bilan ifodalaydi:
- 32-bit integer;
- 64-bit integer;
- double;
- decimalga oid type.
Bu database va language o‘rtasida aniqroq type mapping beradi.
Client language katta integerni yo‘qotmasligi kerak.
ObjectId
MongoDBda keng ishlatiladigan ObjectId BSONning maxsus type’laridan biri.
U document uchun compact unique identifier sifatida ishlatilishi mumkin.
ObjectId ichidagi timestampga oid qism uni mutlaq xavfsiz random secret qilmaydi.
Authorization IDni taxmin qilish qiyinligiga tayanmaydi.
Date
BSON date qiymatini ma’lum epochdan boshlab millisekundlar ko‘rinishida saqlashi mumkin.
Timezone odatda qiymat ichida alohida saqlanmaydi.
Application UTCga aylantirib, display vaqtida kerakli timezone’ni qo‘llaydi.
Binary data
BSON raw binary payloadni subtype bilan saqlashi mumkin.
Masalan:
- umumiy binary;
- UUIDga oid subtype;
- boshqa application-specific qiymat.
Katta file’larni bitta document ichida saqlash database limit va performance’ga ta’sir qiladi.
Array
BSON array ichida elementlar tartibli saqlanadi.
Binary representationda array indexlari keyga o‘xshash string sifatida kodlanishi mumkin.
Parser logical natijani odatiy list yoki arrayga aylantiradi.
Embedded document
Document ichida boshqa document bo‘lishi mumkin:
user:
name: Farrukh
address:
city: Tashkent
Nested model document database uchun qulay.
Juda chuqur nesting parser va query complexityni oshiradi.
Size
BSON ba’zi kichik JSONlarga qaraganda kattaroq bo‘lishi mumkin.
Sabablar:
Afzalligi — parser value type va lengthni oldindan biladi.
Binary doim textdan kichik degan qoida yo‘q.
Parsing
BSON binary bo‘lgani uchun oddiy text editor bilan o‘qilmaydi.
Driver yoki maxsus tool kerak.
- document length;
- nested boundary;
- type;
- string encoding;
- terminator;
- maksimal depth
ni tekshiradi.
Noto‘g‘ri input memory va parser xavfini yaratishi mumkin.
Extended JSON
BSONdagi maxsus type’larni text JSONda ifodalash uchun Extended JSON ishlatilishi mumkin.
Masalan, ObjectId, date yoki 64-bit integer maxsus wrapper bilan yoziladi.
Canonical va relaxed ko‘rinishlar toolga qarab ishlatilishi mumkin.
Bu export va debuggingni yengillashtiradi.
Schema
BSON document schemaless ko‘rinishi mumkin, ammo application uchun schema baribir zarur.
Tekshiriladi:
- required field;
- type;
- enum;
- array item;
- nesting;
- unknown field;
- max length.
Bir collection ichida bir field turli documentda boshqa type bo‘lsa query va index murakkablashadi.
Index
BSON fieldlar database indexida ishlatilishi mumkin.
Type tartibi, nested path va array index semantikasi query natijasiga ta’sir qiladi.
Bir fieldda mixed numeric yoki string type index va sortingni kutilmagan qiladi.
Driver mapping
Har dasturlash tili BSON type’larini o‘z type’lariga map qiladi.
Muammolar:
- 64-bit integerni JavaScript numberga aylantirish;
- decimal precision;
- timezone;
- UUID byte order;
- binary subtype.
Driverning rasmiy type wrapperlaridan foydalanish mumkin.
BSON va MessagePack
Ikkalasi ham binary structured format.
BSON document database va named field modeliga yaqin.
MessagePack compact umumiy serializatsiyaga yo‘naltirilgan.
BSON key nomlarini saqlagani sabab self-describing, lekin payload kattaroq bo‘lishi mumkin.
BSON va Protobuf
Protobuf oldindan schema va field numberga tayanadi.
BSON document ichida field nomlarini saqlaydi va dynamic structure uchun qulay.
Protobuf compact hamda contract-driven service communicationda samarali.
BSON database document va dynamic data uchun mos.
Security
BSON input untrusted bo‘lsa:
cheklanadi.
Database query operatorlarini user documentidan to‘g‘ridan-to‘g‘ri qabul qilish NoSQL Injection xavfini yaratishi mumkin.
Duplicate key
BSON document ichida bir xil key bir necha marta uchrashi texnik jihatdan parserga bog‘liq muammo yaratishi mumkin. Bir driver birinchi qiymatni, boshqasi oxirgi qiymatni qabul qilsa validation va query semantikasi farqlanadi. Application duplicate keylarni encode bosqichida yaratmaydi, untrusted document esa strict parser bilan tekshiriladi.
Document limiti
Document database odatda bitta BSON document uchun maksimal hajm belgilaydi. Juda katta embedded array yoki binary data record update, replication va network sarfini oshiradi. Katta obyekt alohida storage yoki chunk modelida saqlanishi mumkin.
Bog‘liq tushunchalar
Binary JSON, Document database, MongoDB, ObjectId, Extended JSON, Binary serialization, JSON, MessagePack, Protobuf, NoSQL