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

თუ ვებფილტრს იყენებთ, დარწმუნდით, რომ *.kastatic.org და *.kasandbox.org დომენები არ არის დაბლოკილი.

ძირითადი მასალა

კურსი: კომპიუტერული პროგრამირება > თემა 3

გაკვეთილი 3: რელაციური მოთხოვნა SQL-ში

მონაცემების ურთიერთდაკავშირებულ ცხრილებში განაწილება

აქამდე ყოველთვის ერთ ცხრილთან ვმუშაობდით და ვხედავდით, რა საინტერესო მონაცემების მიღება შეგვეძლო ამ ცხრილიდან. მაგრამ, ძირითადად, ჩვენი მონაცემები განაწილებული გვაქვს რამდენიმე ცხრილში და ეს ცხრილები ერთმანეთთან „დაკავშირებულია" გარკვეული გზით.
მაგალითად, ვთქვათ, გვაქვს ცხრილი იმის აღსარიცხად, თუ რამდენად კარგად ასრულებენ ტესტებს მოსწავლეები და ვინახავთ ელ–ფოსტებსაც, რათა საჭიროების შემთხვევაში მშობლებს მივწეროთ ცუდი ნიშნების შესახებ:
student_namestudent_emailtestgrade
Peter Rabbitpeter@rabbit.comNutrition95
Alice Wonderlandalice@wonderland.comNutrition92
Peter Rabbitpeter@rabbit.comChemistry85
Alice Wonderlandalice@wonderland.comChemistry95
შეიძლება, გვქონდეს ცხრილიც იმ წიგნების აღსარიცხად, რომლებსაც თითოეული მოსწავლე კითხულობს:
student_namebook_titlebook_author
Peter RabbitThe Tale of Mrs. Tiggy-WinkleBeatrix Potter
Peter RabbitJabberwockyLewis Carroll
Alice WonderlandThe Hunting of the SnarkLewis Carroll
Alice WonderlandJabberwockyLewis Carroll
შეიძლება, ცხრილი გვქონდეს მხოლოდ მოსწავლის დეტალური ინფორმაციისათვის:
idstudent_firststudent_laststudent_emailphonebirthday
1PeterRabbitpeter@rabbit.com555-66662001-05-10
2AliceWonderlandalice@wonderland.com555-44442001-04-02
რას ფიქრობთ ამ ცხრილებზე? შეცვლიდით მათში რაიმეს?
ამ ცხრილებზე ერთი მნიშვნელოვანი რამ უნდა გავიაზროთ: ისინი რელაციურ (დაკავშირებულ) მონაცემებს აღწერენ — ანუ იმ მონაცემებს, რომლებიც კავშირშია ერთმანეთთან. ამ ცხრილებიდან თითოეული აღწერს კონკრეტულ მოსწავლესთან დაკავშირებულ მონაცემებს, სხვა ბევრი ცხრილი იმეორებს იმავე იდეას. როდესაც ერთი და იგივე მონაცემები მეორდება რამდენიმე ცხრილში, შეიძლება, საინტერესო შედეგებს წავაწყდეთ.
მაგალითად, რა მოხდება მაშინ, თუ მოსწავლის ელფოსტა შეიცვალა? რომელი ცხრილების შეცვლა დაგვჭირდება?
დაგვჭირდებოდა მოსწავლის ინფორმაციის ცხრილის შეცვლა, მაგრამ ვინაიდან ის ნიშნების ცხრილშიც შევიყვანეთ, აგრეთვე დაგვჭირდებოდა ყოველი სტრიქონის პოვნა ამ მოსწავლის შესახებ და მასში ელ–ფოსტის შეცვლაც.
ხშირად უმჯობესია, რომ მონაცემთა კონკრეტული სვეტი შენახული იყოს მხოლოდ ერთ ადგილას, რათა ნაკლებ ადგილზე დაგვჭირდეს განახლება, რაც თავისთავად ამცირებს რისკს, რომ სხვადასხვა ადგილას სხვადასხვა მონაცემი გვექნება. თუ ამას გავაკეთებთ, უნდა დავრწმუნდეთ, რომ გვაქვს გზა, რომლითაც ერთმანეთს ვუკავშირებთ მონაცემებს სხვადასხვა ცხრილებში, რაზეც მომავალში ვისაუბრებთ.
ვთქვათ, გადავწყვიტეთ, ამოვიღოთ ელფოსტა ქულების ცხრილიდან, რადგან გავიაზრეთ, რომ ის ზედმეტია მაშინ, როცა სტუდენტების დეტალების ცხრილშიც გვაქვს ელფოსტა. აი, რა გვექნებოდა:
student_nametestgrade
Peter RabbitNutrition95
Alice WonderlandNutrition92
Peter RabbitChemistry85
Alice WonderlandChemistry95
როგორ უნდა გავარკვიოთ ელფოსტა თითოეული მოსწავლისთვის? შეგვიძლია, ვიპოვოთ მწკრივი მოსწავლის ინფორმაციის ცხრილში სახელის დამთხვევის მიხედვით. იმ შემთხვევაში რა ხდება, თუ ორ მოსწავლეს ერთი და იგივე სახელი აქვს? (იცოდით, რომ კუნძულ ბალიზე ყოველ ადამიანს მხოლოდ 4-იდან 1 შესაძლო სახელი ჰქვია?) სახელს ვერ ვენდობით მოსწავლის მოსაძებნად და, ისედაც, არასოდეს არ უნდა ვენდოთ სახელის მსგავს რაღაცას ცხრილში რაიმეს უნიკალურად იდენტიფიკაციისათვის.
ასე რომ, საუკეთესო ვარიანტია student_name-ის ამოღება და მისი ჩანაცვლება student_id-ით, რადგან ეს გარანტირებულად არის უნიკალური იდენტიფიკატორი:
student_idtestgrade
1Nutrition95
2Nutrition92
1Chemistry85
2Chemistry95
წიგნების ცხრილშიც იმავეს შევცვლიდით, student_name–ის ნაცვლად გამოვიყენებდით student_id–ს:
student_idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
1JabberwockyLewis Carroll
2The Hunting of the SnarkLewis Carroll
2JabberwockyLewis Carroll
შეამჩნიეთ, რომ სათაური და ავტორი ორჯერ გვიმეორდება Jabberwocky-ისთვის? ეს კიდევ ერთი გამაფრთხილებელი ნიშანია იმისა, რომ შეგვიძლია, ჩვენი ცხრილი დავშალოთ რამდენიმე დაკავშირებულ ცხრილად, რათა არ მოგვიწიოს ბევრი ადგილის განახლება იმ შემთხვევაში, როცა წიგნის შესახებ რაიმეს ვცვლით.
შეგვეძლო, გვქონოდა ცხრილი მხოლოდ წიგნებზე:
idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
2JabberwockyLewis Carroll
3The Hunting of the SnarkLewis Carroll
და შემდეგ ჩვენი student_books გახდება:
student_idbook_id
11
12
23
22
ვიცი, რომ ეს ცხრილი იმდენად წაკითხვადი არ არის, რამდენადაც წინა ცხრილი, რომელსაც მთელი ინფორმაცია მოთავსებული ჰქონდა თითოეულ მწკრივში. მაგრამ ცხრილების დიზაინის მიზანი ხშირ შემთხვევაში არ არის ადამიანისათვის ადვილად წაკითხვადობა - მისი პრიორიტეტია, ადვილი იყოს ცხრილზე ზრუნვა და იყოს შეცდომებისგან დაზღვეული. ხშირ შემთხვევაში, საუკეთესო გზაა ინფორმაციის რამდენიმე დაკავშირებულ ცხრილში დაყოფა, რათა გვქონდეს ნაკლები ზედმეტი მონაცემი და ნაკლები განსაახლებელი ადგილი.
მნიშვნელოვანია, გავიაზროთ, როგორ გამოვიყენოთ SQL იმ მონაცემებთან გასამკლავებლად, რომლებიც დაყოფილია რამდენიმე დაკავშირებულ ცხრილში, და საჭიროების შემთხვევაში როგორ უნდა გავაერთიანოთ ცხრილებში არსებული ეს მონაცემები. ამას ვაკეთებთ კონცეფციის გამოყენებათ, რომელსაც ჰქვია „join" (შეერთება) და სწორედ მას განახებთ შემდეგში.

გსურთ, შეუერთდეთ დისკუსიას?

პოსტები ჯერ არ არის.
გესმით ინგლისური? დააწკაპუნეთ აქ და გაეცანით განხილვას ხანის აკადემიის ინგლისურენოვან გვერდზე.