8.1 Nega denormalizatsiya kerak?
Yirik jadvallar bilan ishlashda hisoblash resurslari jihatidan eng qimmat operatsiya — bu birlashishdir. Shu sababli, agar bir so'rovda bir nechta jadvallarni birlashtirish talab etilsa va ular ko'plab million satrdan iborat bo'lsa, MBMS ko'p vaqt sarflaydi. Foydalanuvchi shu paytda kofe ichib olish mumkin. Interaktivlik deyarli yo'qoladi va paketli ishlov berishga qarab yaqinlashadi. Yomonrog'i, paket rejimida foydalanuvchi ertalab so'ralgan barcha ma'lumotlarni oladi va ular bilan kechgacha ishlaydi, yangi so'rovlarni tayyorlaydi.
Jadvallarni murakkab birlashtirish vaziyatidan qochish uchun ularni denormalizatsiya qilishadi. Lekin bu har qanday tarzda emas. Ma'lumotlar ombori jadvallarini qurish qoidalariga muvofiq, denormalizatsiya qilingan jadvallarni "normalizatsiya qilingan" deb hisoblash imkonini beradigan qoidalar mavjud.
Analitik ishlov berishda ikki to'liq "normal" sxema mavjud: "qor uchqun" va "yulduz". Nomlari yaxshi mazmunini ifodalaydi va bog'langan jadvallar rasmlaridan kelib chiqadi.
Har ikki holda ham, sxemaning markaziy elementi faktlar jadvallari bo'lib, u yerda analitikni qiziqtiradigan voqealar, tranzaksiyalar, hujjatlar va boshqalar mavjud. Agar tranzaksiya BQda bir hujjat bir necha jadvallarga bo'linib ketgan bo'lsa (kamida ikkita: sarlavhalar va mazmun-matnlar), fakt jadvalida har bir hujjat satriga yoki guruhlangan satrlar to'plamiga bitta yozuv mos keladi.
Bu ikki yuqorida aytilgan jadvallarni denormalizatsiya qilib amalga oshirilishi mumkin.
8.2 Denormalizatsiya misoli
Endi "ООО Pirojki" va "ZAO Vatrushki" klientlariga muq yoʻnalishlarini oʻrganish uchun MBMSga murojaat qilish qanchalik sodda boʻlishini baholash mumkin.
SELECT
SUM(dl.qty) AS total qty, SUM(dl.price) AS total amount, c.name
FROM
docs d
INNER JOIN doc lines dl ON d.id doc = dl.id doc
INNER JOIN customers c ON d.id customer = c.id customer
INNER JOIN products p ON dl.id product = p.id product
WHERE
c.name IN (’OOO Pirojki’, ’ZAO Vatrushki’) AND
р.name = ’Muq’ AND
d.date BETWEEN ’2014-01-01’ AND ’2014-02-01’
GROUP BY c.name
Analitik BQda:
SELECT
SUM(s.qty) AS total_qty, SUM(s.amount) AS total_amount, c.name
FROM
sales s
INNER JOIN customers c ON d.id_customer = c.id_customer
INNER JOIN products p ON dl.id_product = p.id_product
WHERE
c.name IN ('OOO Pirojki', 'ZAO Vatrushki') AND
p.name = 'Muq' AND
s.date BETWEEN '2014-01-01' AND '2014-02-01'
GROUP BY c.name
Ikki hujjat va ularning tarkibi orasidagi murakkab birlashish oʻrniga, millionlab satrlarni oʻz ichiga olgan holda, MBMS faktlar jadvali bilan toʻgʻridan-toʻgʻri ishlashni va kichik yordamchi jadvallar bilan qulay birlashishni taqdim etadi, ular identifikatorlarni bilgan holda oʻtkazilishi mumkin.
SELECT
SUM(s.qty) AS total_qty, SUM(s.amount) AS total_amount, s.id_customer
FROM
sales s
WHERE
s.id_customer IN (1025, 20897) AND
s.id_product = 67294 AND
s.date BETWEEN '2014-01-01' AND '2014-02-01'
GROUP BY s.id_customer
"Yulduz" va "qor uchqun" sxemalariga qaytamiz. Birinchi rasmda klientlar jadvali, ularning guruhlari, do'konlari, sotuvchilar va tovarlar joylashuvi qoldirilgan. Denormalizatsiya qilishda, bu jadvallar, ya'ni o'lchovlar, fakt jadvali bilan birlashadi. Agar fakt jadvali boshqa o'lchovlar (ikkinchi va undan yuqori darajadagi) havolalariga ega bo'lsa, bunday sxema "qor uchqun" deyiladi.
Ko'rinib turibdiki, klientlar guruhlari bo'yicha filtrlanishi kerak bo'lgan so'rovlarda qo'shimcha birlashma talab etiladi.
SELECT sum(amount)
FROM sales s
INNER JOIN customers c ON s.id_customer = c.id_customer
WHERE c.id_customer_group IN (1, 2, 10, 55)
Bunday holda, denormalizatsiyani davom ettirish va ikkinchi darajadagi o'lchovni birinchi darajaga tushirish mumkin. Bu fakt jadvaliga so'rovlarni osonlashtiradi. Bunday sxema "yulduz" deyiladi. U o'lchovlar ierarxiyasini to'liq yo'q qiladi va so'rovda tegishli jadvallarni birlashtirish zaruratini bartaraf qiladi. O'lchov jadvallari soni yulduzning "nurlariga" mos keladi.
SELECT sum(amount)
FROM sales s
WHERE s.id_customer_group IN (1, 2, 10, 55)
Denormalizatsiyaning doimiy tomoni — bu ortiqcha maʻlumotlarni yaratishdir, bu tranzaksiya va analitik ilovalarda BD hajmini oshiradi. Keling, "qor uchqun" ni "yulduz" ga aylantirishdagi taxminiy farqni hisoblaylik.
Baʼzi MBMSlarda, masalan Oracle, BD sxema ta'riflarining universal tiplarini ishlatish kerak. Bunday holda, numeric(N) mantiqiy tipini ishlatish kerak, bu yerda N — saqlanadigan raqamlar soni. Bunday raqamni saqlash hajmi oddiy, masalan "16 bit integer", turlardan 1-3 bayt ko'proq turadi.
Savdo jadvali ma'lumotlarni siqish funksiyasidan foydalanmaydi va taxminan 500 million satrdan iborat ekanligini va mijozlar soni taxminan 1000 dan iborat. Bunday holda, id_customer_group identifikatori turi sifatida qisqa integer (shortint, smallint), 2 bayt egallaydi, ishlatish mumkin.
Agar MBMS ikkibayt integer turini qo'llab-quvvatlasa (masalan, PostgreSQL, SQL Server, Sybase va boshqalar), savdo jadvaliga id_customer_group ustunini qo'shish uning hajmini 1 gigabaytga oshiradi.
8.3 Denormalizatsiya qachon kerak?
Keling, denormalizatsiya foydali boʻlishi mumkin boʻlgan ba'zi keng tarqalgan vaziyatlarni koʻrib chiqaylik.
Jadvallarni koʻp sonli birlashtirish
To'liq normalizatsiya qilingan ma'lumotlar bazasida 10 va undan ortiq jadvallarni birlashtirishni talab etuvchi so'rovlar resurs talablar va sekin ishlaydi. Bu muammoni hal qilish uchun quyidagilar yordam berishi mumkin:
- Denormalizatsiya jadvallar sonini qisqartirish orqali amalga oshirilishi mumkin. Oʻlchami kichik boʻlgan, kam oʻzgaradigan (shartli-doimiy yoki normativ-ma'lumotnoma) ma'lumotni olib tashlash yaxshiroq.
- Agar ko'p sonli so'rovlar bajarilishi uchun besh yoki olti yoki undan ortiq jadvallarni birlashtirish talab qilinsa, ma'lumotlar bazasini denormalizatsiya qilishni ko'rib chiqing.
- Denormalizatsiya, qo'shimcha maydon qo'shish orqali amalga oshirilishi mumkin. Bu ortiqcha ma'lumotlarga olib keladi, shuning uchun BDning yaxlitligini saqlash uchun qo'shimcha choralar talab qilinadi.
Hisoblangan qiymatlari
Ko'pincha murakkab hisob-kitoblar bilan bog'liq so'rovlar sekin bajariladi va ko'p resurslar talab qiladi, ayniqsa guruhlash va aggretatsiya funktsiyalari (Sum, Max va boshqalar) qo'llanilganda. Bunday holda, ko'pincha ishlatiladigan (va murakkab hisoblanadigan) qiymatlar bilan jadvalga 1-2 qo'shimcha ustun qo'shish mumkin.
Masalan, buyurtmaning umumiy qiymatini aniqlash uchun har bir mahsulot narxini (mahsulot birlik soni * mahsulot birlik narxi – chegirma) hisoblash va buyurtmalar bo'yicha qiymatlarni guruhlash kerak. Bunday so'rovni bajarish, agar ma'lumotlar bazasida ko'plab buyurtmalar saqlanganligini hisobga olsangiz, ko'p vaqt olishi mumkin.
Buning o'rniga, buyurtma joylashtirish jarayonida uning narxini hisoblab chiqish va buyurtmalar jadvaliga alohida ustunda saqlash mumkin. Shunday qilib, natijani olish uchun ushbu ustundan oldindan hisoblangan qiymatlarni chiqarib olish kifoya qiladi. Bu so'rovni bajarish vaqtini tejaydi, lekin bu ustundagi ma'lumotlarni o'z vaqtida yangilashni talab qiladi.
Uzun maydonlar
Agar ma'lumotlar bazasida katta o'lchamli uzun maydonlar (Blob, Long va h.k.) bo'lsa, uzun maydonlarni alohida jadvalga chiqarib, so'rovlar bajarilishini tezlashtirish mumkin. Masalan, professional sifatida fotosuratlar katalogi yaratmoqchi bo'lsak, yuqori sifat, yuqori rezolyutsiya va muvofiqlashtirilgan o'lchamni o'z ichiga olgan holda, to'g'ri strukturani ishlatish maqsadga muvofiq bo'ladi.
- Fotosurat IDsi
- Mualif IDsi
- Fotokamera modeli IDsi
- fotosuratning o'zi (blob-maydon)
Qandaydir mualif tomonidan olingan fotosuratlar sonini hisoblash qancha vaqt olishini tasavvur qiling. Bunday vaziyatda normallik qoidalarini buzadigan toʻgʻri yechim fotosurat IDsi va blob-maydon bilan alohida jadval yaratishdir. Shu tariqa, asosiy jadvaldan (blob-maydonni chiqarib) tanlovlar darhol amalga oshiriladi. Agar fotosuratga qarash kerak bo'lsa, kutish kerak bo'ladi.
Denormalizatsiya qachon oqlanadi?
8.4 Denormalizatsiyaning ijobiy va salbiy tomonlari
Xatti-harakatning maqsadga muvofiqligini baholashning bir yo'li - xarajatlar va mumkin bo'lgan foydalarni tahlil qilish. Denormalizatsiya qilingan ma'lumotlar modelining qancha turishi?
Boshlanish uchun talablarni aniqlash va ushbu talablarni minimum qondiradigan qadamni topish kerak. Keyin xarajatlarni hisoblash va amalga oshirish lozim.
Xarajatlar ichiga fizik jihatlar, masalan, disk joyi, struktura boshqarish resurslari va xizmat ko'rsatish vaqtida kutish kiradi. Denormalizatsiya ma'lumotlarning ortiqcha bo'lishiga olib keladi, bu esa ishlashni oshirishi mumkin, lekin bog'langan maʼlumotlarni nazorat qilish uchun ko'proq kuch talab qiladi. Dasturlar yaratish qiyinlashadi, chunki ma'lumotlar takrorlanadi va ularni kuzatish qiyinroq bo'ladi. Maʼlumotlarning bogʻlanish yaxlitligini amalga oshirish ham oson ish emas.
Denormalizatsiyaning afzalliklari: yuqori so'rov ishlash, tezkor javob, o'tkazuvchanligini oshirish, mijozlar va ishlash qoniqishlari, tashqi dasturchilar vositalaridan samarali foydalanish.
So'rovlar tez-tezligi va ishlash qobiliyati barqarorligi
72% har kuni korxona tomonidan yaratiladigan 1000 so'rovdan bu birlashtirilgan maʼlumotlar so'rovlaridir, detallar emas. Birlashtirilgan jadvaldan foydalanish so'rovlar ishlash vaqtini 4 daqiqadan 6 soniyaga qisqartiradi. Bu haftasiga 2500 daqiqa tejaydi, hatto jadvalni qoʻllab-quvvatlash uchun 100 daqiqa sarflansa ham. Vaqt o'tishi bilan, ko'p qismi so'rovlar detallar ma'lumotiga qo'shiladi. Bunday holda, boshqa jarayonlarga ta'sir qilmasdan, birlashtirilgan jadvaldan voz kechish mumkin.
Yana ham...
Yuqoridagi me'zonlar denormalizatsiyani yanada optimallashtirishni qaror qabul qilishda ko'rib chiqilishi kerak bo'lgan yagona omillar emas. Biznes ustuvorliklari va yakuniy foydalanuvchilar ehtiyojlarini ham hisobga olish kerak. Foydalanuvchilar tezkor so'rov bajarilishini talab qiladiganlar, tizim arxitekturasining texnik tomonlariga qanday ta'sir qilishini tushunishi kerak. Buning uchun bunday jadvallarni yaratish va ular bilan ishlash bilan bog'liq xarajatlarni taqdim etish yaxshi.
8.5 Denormalizatsiyani qanaqa to'g'ri amalga oshirish kerak
Detallar jadvallarni saqlash
Biznes uchun bazaning imkoniyatlarini cheklamaslik uchun saqlash strategiyasiga rioya qilish kerak, yaʼni o'rniga qoʻyish. Ya'ni, chuqur tahlil uchun detallar jadvallarini saqlash va ularga denormalizatsiya qilingan tuzilmalar qo'shish. Masalan, tashrif sanog'i. Biznes uchun veb-sahifaga tashriflar sonini bilish muhim. Davrlar, mamlakatlar va boshqalar bo'yicha tahlil uchun detallar kerak bo'lishi mumkin – har bir tashrif haqida ma'lumot beruvchi qatlam.
Triggerlardan foydalanish
Ma'lumotlar bazasining tuzilishini denormalizatsiya qilish va shu bilan birga normalizatsiya afzalliklaridan foydalanish mumkin, agar ma'lumotlarning yaxlitligi va takroriy ma'lumotlar identikligini saqlash uchun ma'lumotlar bazasining triggerlardan foydalansangiz. Masalan, hisoblangan maydonni qo'shganda, u boshqa ustunlarga bog'liq bo'lsa, bir trigger o'rnatishingiz mumkin, u bitta saqlangan protsedurani chaqiradi. Ushbu protsedura kerakli ma'lumotlarni hisoblanganda maydonga yozadi. Hisoblangan maydon bog'liq bo'lgan barcha ustunlar haqida unutmang.
Dasturiy qo'llab-quvvatlash
Agar ichki triggerlar va saqlangan protseduralardan foydalanmasangiz, dastur ishlab chiqaruvchilar denormalizatsiya qilingan bazada ma'lumotlarning zid bo'lmasligini ta'minlashlari kerak.
Triggerlar singari, o'zgartirilgan maydondan bog'langan barcha maydonlarni yangilaydigan bitta funksiya bo'lishi kerak.
Natijalar
Denormalizatsiyada bazaning tezligini oshirish va ma'lumotlarning zid bo'lish xavfi o'rtasida, Select so'zlarini yozayotgan dasturchilar hayotini osonlashtirish va bazani to'ldirish va yangilashni ta'minlovchilarga qiyinchilikni oshirish o'rtasida muvozanatni saqlash muhim. Shuning uchun denormalizatsiyani ehtiyotkorlik bilan va tanlab amalga oshirish kerak, faqat u holda qila olmaydigan joylarda.
Agar denormalizatsiyaning ijobiy va salbiy tomonlarini oldindan baholash mumkin bo'lmasa, avval normalizatsiya qilingan jadvallar bilan modelni amalga oshirish kerak, keyin esa muammoli so'rovlarni optimallashtirish uchun denormalizatsiya qilish kerak.
Denormalizatsiyani asta-sekin amalga oshirish kerak va faqat turli jadvallardan bog'langan ma'lumotlarni doimiy tanlashlar mavjud bo'lganda. Ma'lumotlar takrorlanganida yozuvlar soni ortadi, lekin o'qishlar soni kamayadi. Hisoblangan ma'lumotlarni kerak bo'lmagan aggregat tanlovlardan qochib, ustunlarda saqlash yaxshiroq.
GO TO FULL VERSION