Көпкестелік дерекқор құру
100 музыкалық аспапты бір кестеге жазсаң, әр аспаптың өндірушісінің мекенжайын ҚАЙТА-ҚАЙТА теруің керек болар еді. Ал өндіруші мекенжайы өзгерсе ше — жүздеген жазбаны түзетесің бе? Дәл осы мәселе деректерді бірнеше кестеге БӨЛУ идеясын тудырды. Бүгін көпкестелік дерекқордың неге қажет екенін және оны қалай құруды үйренеміз.
Барлық деректі бір кестеге жинау қарапайым болғанымен, ҮЛКЕН кемшіліктері бар:
| Кемшілік | Мысал |
|---|---|
| Қайталану | Өндіруші аты әр аспап жазбасында қайта-қайта жазылады |
| Өзгерту қиындығы | Бір атауды өзгерту үшін БІРНЕШЕ жазбаны түзету керек |
| Қате көбею | Қайталанатын деректің бір жерінде қате кетсе, сәйкессіздік туады |
Берілді: musical_instruments бір кестелі дерекқорында аспап атауы, өндіруші, бағасы бірге сақталған, өндіруші аты бірнеше рет қайталанады.
Шешуі: өндірушілер туралы ақпаратты БӨЛЕК кестеге шығарамыз:
producers: id_producers, name, address
1 | Turdyguov Zh. | Almaty q., Abai kosh., 56
2 | Abramkin V. | Shymkent q., Shakarim kosh., 21 Ал негізгі кестеде өндіруші атының орнына ТЕК оның кодын сақтаймыз:
instruments: id_instr, name_instr, id_producers, price
1 | Dombyra | 1 | 200000
2 | Qobyz | 2 | 150000 Жауабы: id_producers — екі кестені байланыстыратын СЫРТҚЫ КІЛТ қызметін атқарады, қайталану ЖОЙЫЛАДЫ.
Терең нормализациялау үшін атау/түр/материал секілді ҚАЙТАЛАНАТЫН мәтіндік мәндерді де бөлек индекстік кестелерге бөлуге болады — негізгі кестеде тек кодтар сақталады. Бұл деректер қорының көлемін АЗАЙТАДЫ және қайталануды толығымен жояды.
CREATE DATABASE kaz_mus_instruments;
CREATE TABLE name_instr (
id_name_ins INT AUTO_INCREMENT PRIMARY KEY,
name_instr VARCHAR(20)
);
INSERT INTO name_instr VALUES (NULL, 'dombyra');
INSERT INTO name_instr VALUES (NULL, 'qobyz'); Түсіндірме: AUTO_INCREMENT өрісіне NULL берілсе, MySQL келесі бос нөмірді АВТОМАТТЫ түрде тағайындайды.
Деректер қорының тұтастығы — кестелер арасындағы байланыстың ДҰРЫСТЫҒЫН қамтамасыз ету (мыс. instruments кестесінде ЖОҚ id_producers кодын қолданбау).
Байланысқан кестелермен жұмыс істегенде ДҚБЖ бірнеше әрекетті қолдай алады: байланысты жазбалар бар кезде негізгі жазбаны ЖОЮҒА ТЫЙЫМ салу; каскадтық жою (негізгі жазбамен бірге оған байланысты барлық жазбаларды да жою); байланысты өрісті өзгертуге рұқсат беру/бермеу.
| Түрі | Сипаттамасы |
|---|---|
| «Біреуден-көпке» | Бір өндірушінің БІРНЕШЕ аспабы болуы — ЕҢ КӨП тараған түрі |
| «Біреуден-біреуге» | Негізгі кестенің бір жазбасына бағынышты кестенің ТЕК бір жазбасы сәйкес |
| «Көптен-көпке» | Екі жақта да бірнеше жазба сәйкес келеді |
- Бір кестеге барлық деректі жинау — қайталану, өзгерту қиындығы мен қате қаупін тудырады.
- Нормализациялау — қайталанатын деректі бөлек кестеге шығарып, сыртқы кілт арқылы байланыстыру.
- Деректер тұтастығы — кестелер арасындағы байланыстың дұрыстығын қамтамасыз ету.
- Байланыс түрлері: біреуден-көпке (ең көп таралған), біреуден-біреуге, көптен-көпке (аралық кесте керек).