Bosh sahifa Wiki BSON

BSON

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:

  • document length;
  • element type;
  • null-terminated key;
  • encoded value;
  • document terminator

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:

  • key nomlari har documentda saqlanadi;
  • type marker;
  • length field;
  • null terminator.

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.

Parser:

  • 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:

  • document hajmi;
  • nesting depth;
  • string length;
  • binary size;
  • duplicate key;
  • invalid type

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