Мәліметтер базасын жобалаудың негіздері: деректерді нормализациялау қарапайым тілмен, реляциялық мәліметтер базасындағы байланыстардың мақсаты, бір-ко-мекеме байланысы
Деректерді нормализациялау қарапайым тілмен
Деректер базасының құрылымы деректердің қайталанбауымен жасалуы керек. Мұны DBMS-те емес, барлық деректер базасының схемасын бір қарағанда көруге болатын визуалды деректер базасын жобалаушыда, мысалы, Database Design-де жасау ыңғайлы.
Біз онлайн дүкеннің деректер базасының құрылымын жобалап жатқанымызды елестетейік. Біз онда сатылатын өнімдер туралы ақпаратты сақтауға тиістіміз. Сонымен қатар, әр өнім өнім категорияларының біріне жатады. Біз бұл ақпаратты қалай сақтауымыз керек?
Алдымен, өнімдер үшін кесте жасау, әр өнім жазбасында оның атауы, сипаттамасы, бағасы және категория атауын сақтау туралы ойымызда болуы мүмкін:
Неге мұны жасамау жақсы? Онлайн дүкеннің көптеген категориялары мен көптеген өнімдері бар жағдайды елестетіңіз. Категориялардың атауын өзгерту қажет болды. Мұндай іске асыру кезінде сіз өнімдер кестесіндегі әр жазбаға өзгерістер енгізуіңіз керек, категория атын жаңасымен ауыстыруыңыз керек.
Біз бірдей деректердің көптігін сақтаймыз, және оларды өзгерту қиын. Бұдан басқа, категория атын көптеген жазбаларда өзгерту процесінде деректер базасы істен шығып, кейбір аттар өзгеріссіз қалуы мүмкін. Бұл едәуір деректік сәйкессіздікке әкеледі, бұл маңыздлы қателіктерге апаруы мүмкін.
Енді не істейміз? Реляциялық деректер базасының негізгі артықшылығына жүгінейік: кестелер арасында байланыс жасау мүмкіндігі. Біз категория деректерін сақтау үшін бөлек кесте жасауымыз керек. Солайша, категория атауын өзгерту қажет болған кезде, өзгеріс тек бір жазбаға әсер етеді:
Нормалдастырылған деректер құрылымы – бұл мүлдем бірдей деректердің әртүрлі жазбаларда қайталануы мүмкін емес ұғым. Яғни, өнім категориялары туралы ақпаратты сақтауымыз қажет болғанда, өнімдер туралы ақпаратты категориялар туралы ақпараттан бөлек сақтаймыз.
Енді өнімнің қандай категорияға жататындығын қалай түсінеміз? Біз өнімдер мен категориялар арасында байланыс орнатуымыз керек. Ол үшін өнімдер кестесіне category_id өрісін қосамыз және әр өнім жазбасында категория жазбасының id-сін сақтаймыз.
id – бұл кез келген кестеде (көп-көп байланыс кестелерінен басқа, бірақ соған қатысты кейінірек айтамыз) әр жазбада бар ерекше (қайталанбайтын) сан. Бір кестеде екі бірдей id бола алмайды, бұл бізге қажетті жазбаны 100% дәлдікпен алуымызға мүмкіндік береді.
Мұның қалай көрінетінін қараңыз:
Өнімдерге жататын категориялардың уникалды нөмірлерін өнім жазбаларында сақтай отырып, біз әр өнімді категорияға байланысты барлық дерек-мазмұнымен ала аламыз:
SELECT
p.id, p.name, p.description, p.price,
c.id as 'category_id', c.name as 'category_name', c.image as 'category_image'
FROM
product p, category c
WHERE
p.category_id = c.id;
Бір-ко-көп байланыс
Жоғарыдағы скриншотта біз "бір-ко-көп" байланысты жасадық, сондай-ақ "бір-ко-көп" немесе 1:M деп те аталады. Тағы да, бұл мысалмен түсіндіру оңай: біздің байланыстың "бірі" – категория, ал "көп" – өнімдер.
Бұл бір өнім тек бір категорияға ғана жататынын білдіреді (adidas кроссовкалары тек "аяқ киім" категориясына жатады, "қолғақ" немесе "бас киім" емес). Бір категорияда бірнеше өнім болуы мүмкін (мысалы, "аяқ киім" бөлімінде "adidas кроссовкалары", "тері етіктер", "nike кроссовкалары" және т.б. табылады).
Осы байланыстың арқасында біз қажетті логиканы қамтамасыз етеміз, оның мысалыны мен жоғарыда келтірдім. Сондай-ақ, өнім ақпаратын алу кезінде тек категория туралы ақпаратты ғана алмай, белгілі бір категорияға жататын өнімдер тізімін де алуға болады. SQL сұрауымызды кеңейтейік:
SELECT
p.id, p.name, p.description, p.price,
c.id as 'category_id', c.name as 'category_name', c.image as 'category_image'
FROM
product p, category c
WHERE
p.category_id = c.id
AND
c.id = N;
Мұнда N орнына біз уникалды категория нөмірін ауыстыруымыз керек.
Келесі мақалаларда реляциялық деректерді байланыстырудың басқа түрлері туралы ақпарат таба аласыз: көп-көп және бір-бір. Егер бұл сізге пайдалы болып көрінсе, менің білім беру YouTube каналыма жазылып, лайк/пікір қалдырудан тартынбаңыз.