If you're seeing this message, it means we're having trouble loading external resources on our website.

Ако си зад уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Разделяне на данни в свързани таблици

Досега работехме само с една таблица и видяхме колко интересни данни можем да извлечем от нея. Но в действителност в повечето случаи данните ни са разпределени в няколко таблици, а таблиците са "свързани" една с друга по някакъв начин.
Да речем например, че имаме таблица за това колко добре се справят учениците на тестовете. Искаме да включим и имейл адреси, в случай, че искаме да изпратим имейл на родителите заради ниски оценки:
student_namestudent_emailtest (тест)grade (оценка)
Питър Зайковpeter@rabbit.comХранителен95
Алиса Чудестраннаalice@wonderland.comХранителен92
Питър Зайковpeter@rabbit.comХимия85
Алиса Чудестраннаalice@wonderland.comХимия95
Може да имаме и таблица със записи на книгите, които чете всеки ученик:
student_namebook_title (заглавие на книгата)book_author (автор)
Питър ЗайковПриказка за Г-жа Тиги-УинкълБеатрикс Потър
Питър ЗайковДжабъруокиЛуис Карол
Алиса ЧудестраннаЛовът на акулатаЛуис Карол
Алиса ЧудестраннаДжабъруокиЛуис Карол
Освен това ни трябва и таблица с подробна информация за ученика:
idstudent_first (първо име)student_last (фамилия)student_emailphone (телефон)birthday (роден на)
1ПитърЗайковpeter@rabbit.com555-66662001-05-10
2АлисаЧудестраннаalice@wonderland.com555-44442001-04-02
Какво мислиш за тези таблици? Дали можеш да ги промениш по някакъв начин?
Има едно важно нещо, което трябва да разбереш за тези таблици: те описват релационни данни – данни, които са свързани едни с други. Всяка таблица описва данни, свързани с конкретен ученик, а данните се повтарят в много от таблиците. Когато данните се повтарят в няколко таблици, може да има интересни последствия.
Ами ако се промени имейл адресът на ученика? Кои таблици трябва да промениш?
Ще трябва да променим таблицата с информация за ученика, но тъй като тази информация е включена в таблицата с оценките, трябва да намерим всеки ред за ученика и да променим имейл адреса.
Често е за предпочитане да се уверим, че дадена колона с данни е запазена само на едно място, за да има по-малко места, които да променяме и по-малък риск за различни данни на различни места. Ако го направим, трябва да се уверим, че имаме начин, по който да свържем данните през таблиците, до което ще стигнем по-късно.
Да речем, че сме решили да махнем имейл адреса от таблицата с оценките, защото сме разбрали, че се повтаря с този в таблицата с детайли за ученика. Имаме ето това:
student_nametest (тест)grade (оценка)
Питър ЗайковХранителен95
Алиса ЧудестраннаХранителен92
Питър ЗайковХимия85
Алиса ЧудестраннаХимия95
Как можем да разберем имейл адреса на всеки ученик? Можем да намерим реда в таблицата с информация за ученика като търсим по име. Ами ако има 2-ма ученика с едно и също име? (Знаеш ли, че в Бали всеки има само 1 от 4 възможни първи имена?) Не можем да разчитаме на името, за да намерим ученика. Всъщност не трябва никога да използваме нещо като име за уникален идентификатор в една таблица.
Затова най-добре е да махнем името на ученика (student_name) и да го заместим със student_id, тъй като това със сигурност е уникален идентификатор:
student_idtest (тест)grade (оценка)
1Хранителен95
2Хранителен92
1Химия85
2Химия95
Можем да направим същата промяна и в таблицата с книгите като използваме student_id вместо student_name:
student_idbook_title (заглавие на книгата)book_author (автор)
1Приказка за Г-жа Тиги-УинкиБеатрикс Потър
1ДжабъруокиЛуис Карол
2Ловът на акулатаЛуис Карол
2ДжабъруокиЛуис Карол
Забелязваш ли, че заглавието и авторът се повтарят за Джабъруоки? Това е знак, че трябва да разделим таблицата на допълнителни таблици, за да не се налага да я актуализираме няколко пъти, ако нещо за книгата се промени.
Можем да имаме таблица само за книги:
idbook_title (заглавие на книгата)book_author (автор)
1Приказка за Г-жа Тиги-УинкиБеатрикс Потър
2ДжабъруокиЛуис Карол
3Ловът на акулатаЛуис Карол
А таблицата student_books става:
student_idbook_id
11
12
23
22
Разбирам, че тази таблица не изглежда толкова ясна, като предната, в която имахме информация, сбита във всеки ред. Но таблиците обикновено не са предназначени за чете от хора – те са проектирани така, че да са лесни за поддръжка и възможно най-малко податливи на бъгове. В много случаи би било най-добре информацията да се разпредели на множество свързани таблици, така че да има по-малко повтарящи се данни и по-малко места за обновяване.
Важно е да разбираш как да използваш SQL, за да работиш с данни, разделени в няколко релационни таблици, и как да събереш данните от таблиците, когато е необходимо. Използваме понятие, наречено "join", и сега ще ти покажа какво означава то.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.