Jasur

12/04/2020

Shajarali ma'lumotlarni bazada saqlash va ularni boshqarish?

Shajara (arab. — daraxt) so'zi kishilarning kelib chiqishi, ajdodlari va qon-qarindoshlik aloqalari majmui degan ma'noni bildiradi.Xuddi shunday bog'liqlikdagi ma'lumotlarni dasturlashda ham ko'rish mumkin.Masalan:menyu,kategoriya....Shajarali ma'lumotlarda eng asosiy 3 ta element mavjud:

  1. ota(parent);
  2. bola(child);
  3. chuqurlik(level,depth);

Shu 3 element orqali biz shajaraga bo'ladigan barcha savollarga javob olishimiz mumkin.Shajarani bazaga saqlashda har xil strukturalardan foydalanishadi.Amma ko'chilikda server resursi va vaqti cheklanganligi uchun muammolar keltirib chiqadi.Eng kam resurs va vaqt sarflanadigan o'zim bilganlardan 2 tasini kategoriya misolida tushuntiraman.

1) Bunda shajara haqida ma'lumotlar har bir ota uchun alohida yoziladi,shu tufayli bir so'rov orqali otaga tegishli shajaraning barcha ma'lumotlarini olish mumkin.Misol(MySQL da):

CREATE TABLE `category` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE  `category_childs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`child_id` int(11) NOT NULL,
`parent_id` int(11) NOT NULL,
`depth` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

category jadvalida kategoriyalar nomlari va category_childs jadvalida ketegoriyalarning shajarasi joylashadi.Har bir ota uchun bolalari ma'lumotlari yoziladi.Masalan:

 INSERT INTO `category` (`id`, `name`) VALUES
(1, 'Telefon'),
(2, 'Kompyuter'),
(3, 'Notebook'),
(4, 'Desktop'),
(5, 'Apple'),
(6, 'Acer');
INSERT INTO `category_childs` (`id`, `category_id`, `child_id`, `parent_id`, `depth`) VALUES
(1, 2, 3, 2, 1),
(2, 3, 5, 3, 1),
(3, 3, 6, 3, 1),
(4, 2, 5, 3, 2),
(5, 2, 6, 3, 2);

Kompyuterga tegishli barcha kategoriyalarni 

SELECT * FROM `category_childs` WHERE category_id = 2

 orqali olishimiz mumkin,bunda Notebook,Apple,Acer lar ko'rinadi.Agar faqat birinchi chuqurlikdagi kategoriyalar kerak bo'lsa depth = 1 sharti qo'shiladi.

2)Bunda ma'lumotlar qayta yozilmaydi,har bir kategoriya uchun shajara ma'lumotlari o'zida(row) saqlanadi.Misol:

CREATE TABLE IF NOT EXISTS `category_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `path` json NOT NULL,
  `depth` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `category_list` (`id`, `name`, `parent_id`, `path`, `depth`) VALUES
(1, 'Kompyuter', 0, '[1]', 0),
(2, 'Notebook', 1, '[1, 2]', 1),
(3, 'Desktop', 1, '[1, 3]', 1),
(4, 'Apple', 2, '[1, 2, 4]', 2),
(5, 'Acer', 2, '[1, 2, 5]', 2);

Kompyuterga tegishli kategoriyalarni 

SELECT * FROM `category_list` WHERE parent_id = 1

Natija Notebook,Desktop bo'ladi.Shu joyida bazamizning 1-struktura bilan 2-strukturasi katta farq qiladi.2-strukturada rekursiya bilan,1-strukturada esa rekursiyasiz ma'lumotlarni olish mumkin.2-strukturada jadvalga chuqurlikga qarab so'rovlar soni ortib boradi.Agar jadvaldagi ma'lumotlar ko'p bo'lmasa foydalansa bo'ladi.Ko'p ma'lumotli jadval bo'lsa 1-strukturani ishlatgan ma'qul,aks holda server uxlab qoladi smiley

Savol yoki fikr mulohazalaringiz bo'lsa,izohlarda kutib qolaman.

Izohlar