C Ma'lumotlar bazasi

Bu maqolada ma’lumotlar bazasiga oid juda kerakli va ko‘pchilik adashtiradigan ikki terminni tushuntirishga harakat qilamiz: Ma’lumotlar bazasi va Ma’lumotlar bazasini boshqarish tizimi (MBBT). Ma’lumotlar bazasi — tartiblangan ma’lumotlarni saqlovchi va qayta ishlovchi axborot modeli hisoblanadi. Soddaroq qilib aytganda, bir xil turdagi axborotlarni o‘zida saqlovchi va berilgan so‘rovlar orqali ularni taqdim etuvchi model. Misol uchun, kitoblar javoni, bu ma’lumotlar bazasi hisoblanadi, ya’ni bir xil turdagi (kitoblarni) obyektlarni o‘zida saqlaydi yoki bo‘lmasa telefon raqamlar yozilgan kitobcha bu yerda ism, telefon raqam kabi bir xil tipdagi ma’lumotlar saqlanadi bu ham ma’lumotlar bazasi hisoblanadi. Ma’lumotlar bazasini boshqarish tizimi — bu ma’lumotlar bazasini hosil qiluvchi ma’lumotlarni qayta ishlovchi va qidiruvchi tizim hisoblanadi. Qisqa qilib aytganda, MBBT barcha jarayonlarni amalga oshiradi. Ma’lumotlar bazasi faqat ma’lumotlarni saqlaydi, qolgan barcha ishlarni MBBT bajaradi. Ma’lumotlar bazasidagi ma’lumotlar, SQL so‘rov tillari orqali boshqariladi, bu tilda MBBTga so‘rov beriladi, bu so‘rov u yerda qayta ishlanib, natija olish uchun ma’lumotlar bazasiga murojaat qiladi, u yerdan so‘rovga mos ma’lumotni olib, so‘rovga javob beradi:

So‘rov berish:

SQL so‘rov -> MBBT -> Ma’lumotlar bazasi

Natija olish:

Ma’lumotlar bazasi -> MBBT — > So‘rovga javob

Quyidagi dasturlar MBBTga misol bo‘la oladi:

  • Oracle;
  • MySQL;
  • Microsoft Office Access;
  • MariaDB;
  • Microsoft SQL Server;

Xulosa shuki, siz o‘ylagan bu dasturlar, ma’lumotlar bazasi emas, balki MBBT hisoblanadi. Ma’lumotlar bazasi MBBTning bir qismidir, demak bu dasturlarni ishlatganda «ma’lumotlar bazasi sifatida MySQLni tanladim» emas, balki «Ma’lumotlar bazasini boshqarish tizimi sifatida MySQLni tanladim» to‘g‘ri bo‘ladi. MBBTda CRUD degan atama mavjud.

CRUD

CRUDCREATE, READ, UPDATE va DELETE so'zlarining qisqartmasi. Ushbu atamalar, asosan, relyatsion va NoSQL ma'lumotlar bazalarida doimiy ma'lumotlar elementlarini yaratish va boshqarish uchun to'rtta muhim operatsiyani tavsiflaydi. Ushbu post CRUD operatsiyalari ma'lumotlarni qayta ishlash uchun qanday ishlatilishini tasvirlaydi. Biz shuningdek, tizim boshqaruvchilari yoki DevOps muhandislari ma'lumotlar bazasini kuzatishda topa oladigan muammolarni ko'rsatamiz.

CRUDni tushuntirish

Yuqorida aytib o'tilganidek, CRUD operatsiyalari doimiy saqlash ilovalarida qo'llaniladi, ya'ni bu ilovalar tizim o'chirilgandan keyin ham o'z ma'lumotlarini saqlaydi. Ular tasodifiy kirish xotirasi yoki kesh fayllari kabi o'zgaruvchan xotirada saqlanadigan ma'lumotlar bilan bog'liq operatsiyalardan farq qiladi. CRUD ma'lumotlar bazasi ilovalarida keng qo'llaniladi. Bunga Oracle, MySQL va PostgreSQL kabi Relational Database Management Systems (RDBMS) kiradi. Shuningdek, u MongoDB, Apache Cassandra va AWS DynamoDB kabi NoSQL ma'lumotlar bazalarini o'z ichiga oladi. CRUDga o'xshash operatsiyalar fayllar kabi doimiy ma'lumotlar tuzilmalarida bajarilishi mumkin. Misol uchun, siz Microsoft Word hujjatini yaratishingiz, uni yangilashingiz, o'qishingiz va hatto fayl tadqiqotchisidan o'chirishingiz mumkin. Biroq, fayllar yozuvga yo'naltirilmagan (yoki MongoDB yoki Couchbase misolida hujjatga yo'naltirilgan). CRUD terminologiyasi, xususan, tekis fayl operatsiyalari o'rniga yozuvga yo'naltirilgan operatsiyalar bilan bog'liq.

YARATMOQ(CREATE)

CREATE operatsiyasi ma'lumotlar bazasiga yangi yozuv qo'shadi. RDBMSda ma'lumotlar bazasi jadvali qatori yozuv deb ataladi, ustunlar esa atributlar yoki maydonlar deb ataladi. CREATE operatsiyasi jadvalga har xil maydon qiymatlari bilan bir yoki bir nechta yangi yozuvlarni qo'shadi. Xuddi shu tamoyil NoSQL ma'lumotlar bazalariga ham tegishli. Agar NoSQL ma'lumotlar bazasi hujjatga yo'naltirilgan bo'lsa, u holda to'plamga yangi hujjat (masalan, atributlari bilan JSON formatlangan hujjat) qo'shiladi, bu RDBMS jadvaliga ekvivalentdir. Xuddi shunday, DynamoDB kabi NoSQL ma'lumotlar bazalarida CREATE operatsiyasi jadvalga element qo'shadi (bu yozuvga ekvivalent).

O'QING(READ)

READ ba'zi qidiruv mezonlari asosida ma'lumotlar bazasi jadvalidan (yoki to'plam yoki chelakdan) yozuvlarni (yoki hujjatlar yoki elementlarni) qaytaradi. READ operatsiyasi barcha yozuvlarni va ayrim yoki barcha maydonlarni qaytarishi mumkin.

YANGILANISH(UPDATE)

UPDATE ma'lumotlar bazasidagi mavjud yozuvlarni o'zgartirish uchun ishlatiladi. Misol uchun, bu mijozlar ma'lumotlar bazasidagi manzilning o'zgarishi yoki mahsulot ma'lumotlar bazasidagi narxlarning o'zgarishi bo'lishi mumkin. O'qishga o'xshab, yangilanish mezonlar asosida barcha yozuvlarda yoki faqat bir nechtasida qo'llanilishi mumkin. Yangilash operatsiyasi yozuvning bir yoki bir nechta maydoniga kiritilgan o'zgarishlarni o'zgartirishi va davom ettirishi mumkin. Agar bir nechta maydonlar yangilanishi kerak bo'lsa, ma'lumotlar bazasi tizimi ularning barchasi yangilangan yoki umuman yangilanmaganligini ta'minlaydi. Ba'zi katta ma'lumotlar tizimlari UPDATE ni amalga oshirmaydi, lekin har safar qatorning yangi versiyasini qo'shib, faqat vaqtda CREATE operatsiyasiga ruxsat beradi.

OʻCHIRISH(DELETE)

DELETE operatsiyalari foydalanuvchiga ma'lumotlar bazasidan yozuvlarni olib tashlash imkonini beradi. Qattiq o'chirish yozuvni butunlay o'chirib tashlaydi, yumshoq o'chirish esa yozuvni belgilab qo'yadi, lekin uni joyida qoldiradi. Misol uchun bu ishchi kompaniyani tark etganidan keyin ham mehnat daftarchalari saqlanishi kerak bo'lgan ish haqi fondida muhim ahamiyatga ega.

Ma'lumotlar bazasiga ulanish

Quyidagi C kod segmenti mavjud ma'lumotlar bazasiga qanday ulanishni ko'rsatadi. Agar ma'lumotlar bazasi mavjud bo'lmasa, u yaratiladi va nihoyat ma'lumotlar bazasi obyekti qaytariladi.

Kod namunasi

#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Ma'lumotlar bazasini ochib bo'lmadi: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Ma'lumotlar bazasi muvaffaqiyatli ochildi\n");
   }
   sqlite3_close(db);
}
$gcc test.c -l sqlite3 $./a.out Ma'lumotlar bazasi muvaffaqiyatli ochildi

Jadval yaratish

Oldindan yaratilgan ma'lumotlar bazasida jadval yaratish uchun quyidagi C kod segmentidan foydalaniladi.

Kod namunasi

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   /* Ma'lumotlar bazasini ochish*/
   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Ma'lumotlar bazasini ochib bo'lmadi: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stdout, "Ma'lumotlar bazasi muvaffaqiyatli ochildi\n");
   }
   /* SQL bayonatini yaratish */
   sql = "Salom yosh dasturchilar" \
      "Xush kelibsiz Uzbekdevs saytiga" ;
   /* SQL bayonatini bajarish */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL xatosi: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Jadval muvaffaqiyatli yaratildi\n");
   }
   sqlite3_close(db);
   return 0;
}

Chiqish (ma'lumotlar bazasi fayli holatini tekshiring):

Jadval muvaffaqiyatli yaratildi

Operatsiyani kiritish

Quyidagi C kod segmenti yuqoridagi misolda yaratilgan KOMPANIYA jadvalida yozuvlarni qanday yaratishingiz mumkinligini ko'rsatadi -

Kod namunasi

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   /* Ma'lumotlar bazasini yaratish */
   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Ma'lumotlar bazasini ochib bo'lmadi: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Ma'lumotlar bazasi muvaffaqiyatli ochildi\n");
   }
   /* SQL bayonatini yaratish*/
  sql = "Salom yosh dasturchilar" \
      "Xush kelibsiz Uzbekdevs saytiga" ;
   /* SQL bayonotini bajaring */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL xatosi: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Yozuvlar muvaffaqiyatli yaratildi\n");
   }
   sqlite3_close(db);
   return 0;
}
Ma'lumotlar bazasi muvaffaqiyatli ochildi Yozuvlar muvaffaqiyatli yaratildi

SELECT operatsiyasi

Yozuvlarni olish uchun haqiqiy misolga o'tishdan oldin, keling, misollarimizda foydalanayotgan select funksiyasi haqida ba'zi tafsilotlarni ko'rib chiqaylik. Ushbu select iboralaridan natijalarni olish usulini taqdim etadi. Unda quyidagi deklaratsiya mavjud:

typedef int (*sqlite3_callback)(
    void*, /* sqlite3_exec() ning 4-argumentida berilgan maʼlumotlar */
    int, /* qatordagi ustunlar soni */
    char**, /* qatordagi maydonlarni ifodalovchi qatorlar massivi */
    char** /* Ustun nomlarini ifodalovchi satrlar massivi */
);

Agar yuqoridagi misolda sqlite_exec() uchinchi argument sifatida taqdim etilgan bo'lsa, SQLite ushbu chaqirish funksiyasini SQL argumentida bajarilgan har bir select bayonotida qayta ishlangan har bir yozuv uchun chaqiradi. Quyidagi C kod segmenti yuqoridagi misolda yaratilgan Saytlar jadvalidan yozuvlarni qanday olish va ko'rsatish mumkinligini ko'rsatadi:

Kod namunasi

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName) {
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Funksiya chaqirildi";
   /* Ma'lumotlar bazasini ochish*/
   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, ": %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Ma'lumotlar bazasi muvaffaqiyatli ochildi\n");
   }
   /* SQL bayonatini yaratish*/
   sql = "SELECT * from COMPANY";
   /*  SQL bayonatini bajarish*/
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL xatosi: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operatsiya muvaffaqiyatli amalga oshirildi\n");
   }
   sqlite3_close(db);
   return 0;
}
Ma'lumotlar bazasi muvaffaqiyatli ochildi Funksiya chaqirildi: ID = 1 Nomi = Uzbekdevs Asoschisi=Master Sherqulov Funksiya chaqirildi: ID = 2 Nomi = Blogpost Asoschisi=Master Sherqulov Operatsiya muvaffaqiyatli amalga oshirildi