რა არის პირველადი გასაღები მონაცემთა ბაზაში? პირველადი და უცხოური გასაღებების შეზღუდვები აღწერა პირველადი გასაღები უცხო

რა არის პირველადი გასაღები მონაცემთა ბაზაში? პირველადი და უცხოური გასაღებების შეზღუდვები აღწერა პირველადი გასაღები უცხო

ისინი გამოიყენება ნებისმიერ საქმიანობაში: საბანკო და ფინანსურ ინდუსტრიაში, ტურისტულ ბიზნესში, საწყობებში, წარმოებასა და ტრენინგში. ისინი წარმოადგენს ცხრილების კრებულს, აქვთ მკაფიო თვისებები და ექვემდებარება მკაცრ მოთხოვნებს. რელაციურ მონაცემთა ბაზებში ცხრილებს ურთიერთობებს უწოდებენ.

რა არის პირველადი გასაღები მონაცემთა ბაზაში

მონაცემთა ბაზაში ცხრილის პირველადი გასაღები არის მისი ერთ-ერთი სვეტი (პირველადი გასაღები). მოდით შევხედოთ მაგალითს, თუ როგორ გამოიყურება ეს. წარმოვიდგინოთ უნივერსიტეტის სტუდენტების უბრალო დამოკიდებულება (დავარქვათ „სტუდენტები“).

ჩვენ უნდა განვსაზღვროთ მოსწავლე ცალსახად ერთი სვეტის გამოყენებით. ამისათვის ამ სვეტის ინფორმაცია უნიკალური უნდა იყოს თითოეული ჩანაწერისთვის. მაგრამ ამ კუთხით არსებული მონაცემები არ გვაძლევს საშუალებას ცალსახად დავადგინოთ ჩანაწერი, ვინაიდან თანამოსახელეებს, სახელებს და იმავე გვარისა და სახელის მქონე სტუდენტებს შეუძლიათ ისწავლონ იმავე კურსზე და იმავე ფაკულტეტზე. მონაცემთა ბაზაში პირველადი გასაღები გამოიყენება ურთიერთობის საჭირო მწკრივის ზუსტად დასადგენად. ყველაზე ხშირად, ციფრული ველი გამოიყენება ამ ტევადობით, რომელიც ავტომატურად იზრდება ჩანაწერის შეყვანისას (ავტომატური მზარდი იდენტიფიკატორის სვეტი).

მარტივი და კომპოზიტური ძირითადი გასაღები

ძირითადი გასაღები შეიძლება იყოს მარტივი ან რთული. თუ ჩანაწერის უნიკალურობა განისაზღვრება მხოლოდ ერთ ველში მნიშვნელობით, როგორც ზემოთ იყო აღწერილი, საქმე გვაქვს მარტივ გასაღებთან. კომპოზიციური გასაღები არის მონაცემთა ბაზის ძირითადი გასაღები, რომელიც შედგება ორი ან მეტი ველისგან. განვიხილოთ ბანკის კლიენტების შემდეგი დამოკიდებულება.

ᲡᲠᲣᲚᲘ ᲡᲐᲮᲔᲚᲘ. Დაბადების თარიღი პასპორტის სერია პასპორტის ნომერი
ივანოვი პ.ა. 12.05.1996 75 0553009
სერგეევი ვ.ტ. 14.07.1958 71 4100654
კრასნოვი ლ.ვ. 22.01.2001 73 1265165

ხალხის პასპორტები შეიძლება შეიცავდეს იგივე სერიებს ან ნომრებს, მაგრამ არ არსებობს პასპორტები ერთი და იგივე სერიით და ნომრებით. ამრიგად, ველები „პასპორტის სერია“ და „პასპორტის ნომერი“ გახდება მითითებული ურთიერთობის კომპოზიციური გასაღები, რომელიც ცალსახად განსაზღვრავს პირს.

კავშირები ურთიერთობებს შორის

ამრიგად, მონაცემთა ბაზაში პირველადი გასაღები არის ცხრილის ერთი ან მეტი სვეტი, რომელიც საშუალებას აძლევს ადამიანს ცალსახად ამოიცნოს მწკრივი ამ ურთიერთობაში. Რისთვის არის?

დავუბრუნდეთ პირველ მაგალითს მიმართებით „სტუდენტები“. გარდა ამ ურთიერთობისა, მონაცემთა ბაზა ასევე ინახავს სხვა ინფორმაციას, მაგალითად, თითოეული მოსწავლის მუშაობას. იმისათვის, რომ არ გაიმეორონ ყველა ინფორმაცია, რომელიც უკვე შეიცავს მონაცემთა ბაზაში, ისინი იყენებენ გასაღებს, რომელიც მიუთითებს სასურველ ჩანაწერზე. ეს ასე გამოიყურება.

ორ მაგალითურ ურთიერთობაში ჩვენ ვხედავთ ID ველს. ეს არის ძირითადი გასაღებები მონაცემთა ბაზაში ამ ცხრილებისთვის. როგორც ხედავთ, აკადემიური ჩანაწერი შეიცავს მხოლოდ ამ ველების ბმულებს სხვა ცხრილებიდან, მათგან ყველა ინფორმაციის მითითების საჭიროების გარეშე.

ბუნებრივი და სუროგატული გასაღები

როგორ განისაზღვრება მონაცემთა ბაზის ცხრილის პირველადი გასაღები? ჩვენ მიერ განხილული ორი მაგალითი - "სტუდენტები" და "ბანკის კლიენტები" - ასახავს ბუნებრივი და სუროგატული გასაღების ცნებებს. ბანკის კლიენტების ცხრილში უკვე არსებული სვეტების გამოყენებით განვსაზღვრეთ გასაღები, რომელიც შედგება ველებიდან „ნომერი“ და „პასპორტის სერიები“. ამ გასაღებს ბუნებრივი ჰქვია, მის დასადგენად არანაირი ცვლილება ან დამატება არ განგვიხორციელებია. „სტუდენტების“ მიმართების შემთხვევაში, არც ერთი ველი ან ველების კომბინაცია არ გვაძლევდა უნიკალურობას. ამან აიძულა შეგვეტანა სტუდენტის დამატებითი კოდის ველი. ამ გასაღებს ეწოდება სუროგატი გასაღები, რისთვისაც ცხრილს დავამატეთ სერვისის კიდევ ერთი სვეტი. ეს სვეტი არ შეიცავს რაიმე სასარგებლო ინფორმაციას და ემსახურება მხოლოდ ჩანაწერების იდენტიფიცირებას.

უცხოური გასაღები და მონაცემთა მთლიანობა მონაცემთა ბაზაში

ყოველივე ზემოაღნიშნული გვაძლევს უცხო გასაღების და მონაცემთა ბაზის მთლიანობას. საგარეო გასაღები არის ველი, რომელიც ეხება საგარეო ურთიერთობის ძირითად გასაღებს. პროგრესის ცხრილში ეს არის სვეტები "სტუდენტი" და "დისციპლინა". მათი მონაცემები მიგვანიშნებს გარე ცხრილებზე. ანუ „სტუდენტი“ ველი „შესრულება“ მიმართებაში არის უცხო გასაღები, ხოლო „სტუდენტი“ მიმართებაში ის არის პირველადი გასაღები მონაცემთა ბაზაში.

მონაცემთა ბაზების აგების მნიშვნელოვანი პრინციპია მათი მთლიანობა. და მისი ერთ-ერთი წესი არის რეფერენციალური მთლიანობა. ეს ნიშნავს, რომ ცხრილის უცხო გასაღები არ შეიძლება მიუთითებდეს სხვა ურთიერთობის არარსებულ ძირითად გასაღებზე. თქვენ არ შეგიძლიათ წაშალოთ ჩანაწერი 1000 კოდით - ივან ივანოვი სტუდენტური ურთიერთობიდან, თუ იგი მითითებულია ჩანაწერით აკადემიური მოსწრების ცხრილიდან. სწორად აგებულ მონაცემთა ბაზაში, როდესაც ცდილობთ მის წაშლას, მიიღებთ შეცდომას, რომ ეს ველი გამოიყენება.

არსებობს მთლიანობის წესების სხვა ჯგუფები, ისევე როგორც მონაცემთა ბაზის სხვა შეზღუდვები, რომლებიც ასევე იმსახურებენ ყურადღებას და უნდა გაითვალისწინონ დეველოპერებმა.

ნახატზე ნაჩვენებია ცხრილი (ფარდობა 5 ხარისხით), რომელიც შეიცავს გარკვეულ ინფორმაციას ჰიპოთეტური საწარმოს თანამშრომლების შესახებ. ცხრილის რიგები შეესაბამება ტოპებს. თითოეული მწკრივი რეალურად არის ერთი რეალური სამყაროს ობიექტის (ამ შემთხვევაში, მუშაკის) აღწერა, რომლის მახასიათებლებს შეიცავს სვეტები. რელატიური ურთიერთობები შეესაბამება ერთეულების სიმრავლეს, ხოლო ტოპები შეესაბამება ერთეულებს. ცხრილის სვეტები, რომლებიც წარმოადგენენ მიმართებით ურთიერთობას, ეწოდება ატრიბუტები.

თითოეული ატრიბუტი განსაზღვრულია დომენზე, ამიტომ დომენი შეიძლება ჩაითვალოს, როგორც მოცემული ატრიბუტის სწორი მნიშვნელობების ნაკრები. ერთი და იგივე ურთიერთობის მრავალი ატრიბუტი და სხვადასხვა ურთიერთობის ატრიბუტებიც კი შეიძლება განისაზღვროს იმავე დომენზე.

ატრიბუტი, რომლის მნიშვნელობაც ცალსახად განსაზღვრავს ტოპებს, ეწოდება გასაღები (ან უბრალოდ გასაღები). გასაღები არის "პერსონალის ნომერი" ატრიბუტი, რადგან მისი ღირებულება უნიკალურია საწარმოს თითოეული თანამშრომლისთვის. თუ ტოპების იდენტიფიცირება ხდება მხოლოდ რამდენიმე ატრიბუტის მნიშვნელობების შეერთებით, მაშინ ნათქვამია, რომ ურთიერთობას აქვს კომპოზიტური გასაღები.

Მთავარი გასაღები- რელაციური მონაცემთა მოდელში, ურთიერთობის ერთ-ერთი პოტენციური გასაღები, შერჩეული, როგორც პირველადი გასაღები (ან ნაგულისხმევი გასაღები).

ურთიერთობა შეიძლება შეიცავდეს რამდენიმე გასაღებს. ერთ-ერთი გასაღები ყოველთვის გამოცხადებულია პირველადიმისი მნიშვნელობების განახლება შეუძლებელია. ყველა სხვა ურთიერთობის გასაღებს ეწოდება შესაძლო გასაღებები.

თეორიული თვალსაზრისით, ყველა პოტენციური (შესაძლებელი) ურთიერთობის გასაღები ექვივალენტურია, ანუ მათ აქვთ იგივე უნიკალურობა და მინიმალურობის თვისებები. თუმცა, პირველადი გასაღები ჩვეულებრივ შეირჩევა პოტენციური გასაღებებიდან, რომლებიც ყველაზე მოსახერხებელია გარკვეული პრაქტიკული მიზნებისთვის, მაგალითად, შესაქმნელად გარე გასაღებები სხვა კუთხით ან კლასტერული ინდექსის შესაქმნელად. ამიტომ, როგორც წესი, პირველად გასაღებად ირჩევა ის, რომელსაც აქვს ყველაზე მცირე ზომა (ფიზიკური საცავი) და/ან შეიცავს ატრიბუტების უმცირეს რაოდენობას.

თუ მთავარი გასაღებიშედგება ერთი ატრიბუტისაგან, მას ე.წ მარტივი გასაღებით.

თუ მთავარი გასაღებიშედგება ორი ან მეტი ატრიბუტისაგან, ე.წ რთული გასაღები. ასე რომ, სახელი, გვარი, პატრონიმი, პასპორტის ნომერი, პასპორტის სერია ინდივიდუალურად არ შეიძლება იყოს პირველადი გასაღები, რადგან ისინი შეიძლება იყოს იგივე ორი ან მეტი ადამიანისთვის. მაგრამ არ არსებობს ერთი და იგივე ტიპის ორი პერსონალური დოკუმენტი იგივე სერიით და ნომრით. მაშასადამე, ადამიანების შესახებ მონაცემებს შემცველ ურთიერთობაში, პირველადი გასაღები შეიძლება იყოს ატრიბუტების ქვეჯგუფი, რომელიც შედგება პირადი დოკუმენტის ტიპის, მისი სერიებისა და ნომრისგან.



იერარქიული და ქსელური მონაცემთა მოდელებისგან განსხვავებით, რელაციურს არ გააჩნია ჯგუფური ურთიერთობის კონცეფცია. სხვადასხვა ურთიერთობის ტოპებს შორის ასოციაციების ასახვისთვის გამოიყენება მათი გასაღებების დუბლირება.

ატრიბუტები, რომლებიც სხვა ურთიერთობების გასაღებების ასლებია, ეწოდება უცხო გასაღებები.

მაგალითად, DEPARTMENT და EMPLOYEE ურთიერთობებს შორის ურთიერთობა იქმნება პირველადი გასაღების კოპირებით "განყოფილების_ნომერი" პირველი ურთიერთობიდან მეორემდე. ამრიგად, მოცემული განყოფილების თანამშრომელთა სიის მისაღებად აუცილებელია: 1) DEPARTMENT ცხრილიდან დააყენეთ ატრიბუტის მნიშვნელობა. "განყოფილების_ნომერი" , რომელიც შეესაბამება ამ „Department_Name“-ს. 2) აირჩიეთ ყველა ჩანაწერი EMPLOYEE ცხრილიდან, ატრიბუტის მნიშვნელობა "განყოფილების_ნომერი"რაც უდრის წინა საფეხურზე მიღებულს. იმისათვის, რომ გაიგოთ, რომელ განყოფილებაში მუშაობს თანამშრომელი, თქვენ უნდა შეასრულოთ საპირისპირო ოპერაცია: 1) განსაზღვროთ "განყოფილების_ნომერი" EMPLOYEE ცხრილიდან. 2) მიღებული მნიშვნელობის გამოყენებით ვპოულობთ ჩანაწერს DEPARTMENT ცხრილში.


18. ნორმალიზაცია რელაციურ მონაცემთა ბაზებში, ნორმალური ფორმის კონცეფცია მონაცემთა ბაზის დიზაინში.

ნორმალური ფორმა - ურთიერთობის თვისება რელაციური მონაცემთა მოდელში, რომელიც ახასიათებს მას სიჭარბის თვალსაზრისით, რამაც შეიძლება გამოიწვიოს შერჩევის ან მონაცემების შეცვლის ლოგიკურად მცდარი შედეგები. ნორმალური ფორმა განისაზღვრება, როგორც მოთხოვნების ერთობლიობა, რომელიც უნდა აკმაყოფილებდეს ურთიერთობას.

მონაცემთა ბაზის ნორმალურ ფორმაში გადაყვანის პროცესს ეწოდება ნორმალიზაცია . ნორმალიზება მიზნად ისახავს მონაცემთა ბაზის სტრუქტურის იმ ფორმამდე მიყვანას, რომელიც უზრუნველყოფს მინიმალურ ზედმეტობას, ანუ ნორმალიზაცია არ არის გამიზნული სამუშაო პროდუქტიულობის შემცირების ან გაზრდის მიზნით, ან მონაცემთა ბაზის მოცულობის შემცირებაზე ან გაზრდაზე. ნორმალიზაციის საბოლოო მიზანია მონაცემთა ბაზაში შენახული ინფორმაციის პოტენციური შეუსაბამობის შემცირება.



ზედმეტობის აღმოფხვრა ხორციელდება, როგორც წესი, ურთიერთობების დაშლით ისე, რომ თითოეულ ურთიერთობაში ინახება მხოლოდ პირველადი ფაქტები (ანუ ფაქტები, რომლებიც არ არის დასკვნა სხვა შენახული ფაქტებიდან).

ფუნქციური დამოკიდებულებები.

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

19. 1NF: ძირითადი განმარტებები და ტრანსფორმაციის წესები.

პირველი ნორმალური ფორმის განსახილველად საჭიროა ორი განმარტება:

მარტივი ატრიბუტი - ატრიბუტი, რომლის მნიშვნელობები არის ატომური (განუყოფელი).

რთული ატრიბუტი - მიიღება რამდენიმე ატომური ატრიბუტის შეერთებით, რომლებიც შეიძლება განისაზღვროს იმავე ან სხვადასხვა დომენზე (მას ასევე უწოდებენ ვექტორს ან მონაცემთა აგრეგატს).

პირველი ნორმალური ფორმის განმარტება:

კავშირი არის 1NF-ში, თუ მისი ყველა ატრიბუტის მნიშვნელობები ატომურია. . წინააღმდეგ შემთხვევაში, ეს საერთოდ არ არის ცხრილი და ასეთი ატრიბუტები უნდა დაიშალა.

მოდით შევხედოთ მაგალითს:

საწარმოს ადამიანური რესურსების დეპარტამენტის მონაცემთა ბაზაში აუცილებელია თანამშრომლების შესახებ ინფორმაციის შენახვა, რომლის წარდგენა შესაძლებელია

თანამშრომელი (EMPLOYEE_NUMBER, სახელი, დაბადების თარიღი, WORK_HISTORY, CHILDREN).

ამ ურთიერთობის ფრთხილად განხილვიდან გამომდინარეობს, რომ ატრიბუტები "სამუშაო_ისტორია"და "ბავშვები"კომპლექსურია, უფრო მეტიც, ატრიბუტი "სამუშაო_ისტორია"მოიცავს კიდევ ერთ რთულ ატრიბუტს "ხელფასი_ისტორია".
ეს დანაყოფები ასე გამოიყურება:

 JOB_HISTORY (RECEPTION_DATE, NAME, SALARY_HISTORY),

 SALARY_HISTORY (APPOINTMENT_DATE, SALARY),

 CHILDREN (CHILD_NAME, BIRTH_YEAR).

მათი კავშირი ნაჩვენებია ნახ. 3.3.

სურ.3.3. თავდაპირველი დამოკიდებულება.

იმისთვის, რომ თავდაპირველი ურთიერთობა SERVANT პირველ ნორმალურ ფორმამდე მივიყვანოთ, აუცილებელია მისი დაშლა ოთხ მიმართებად, როგორც ეს ნაჩვენებია შემდეგ სურათზე:

სურ.3.4. ურთიერთობების ნორმალიზება.

აქ თითოეული ურთიერთობის პირველადი გასაღები ხაზგასმულია ლურჯი ჩარჩოთი, უცხო კლავიშების სახელები ლურჯი შრიფტით. შეგახსენებთ, რომ უცხოური გასაღებები გამოიყენება ფუნქციონალური დამოკიდებულებების წარმოსაჩენად, რომლებიც არსებობს წყაროს მიმართებაში. ეს ფუნქციური დამოკიდებულებები მითითებულია ისრებით ხაზებით.

ნორმალიზაციის ალგორითმი აღწერილია E.F. Codd-ის მიერ შემდეგნაირად:

  • დაწყებული ხის ზედა მიმართულებიდან (სურათი 3.3.), აღებულია მისი პირველადი გასაღები და ყოველი უშუალოდ დაქვემდებარებული მიმართება გაფართოებულია ამ პირველადი გასაღების დომენის ან დომენების კომბინაციის ჩასმით.
  • ამ გზით გაფართოვებული თითოეული ურთიერთობის ძირითადი გასაღები შედგება ძირითადი გასაღებისგან, რომელიც ურთიერთობას ჰქონდა გაფართოებამდე და დამატებული მშობელი ურთიერთობის ძირითადი გასაღებისგან.
  • ამის შემდეგ, ყველა არამარტივი დომენი წაიშლება მშობლის მიმართებიდან, ამოღებულია ხის ზედა კვანძი და იგივე პროცედურა მეორდება თითოეულ დარჩენილ ქვეხეზე.

20. 2NF: ძირითადი განმარტებებიდა ტრანსფორმაციის წესები.

ძალიან ხშირად, ურთიერთობის პირველადი გასაღები მოიცავს რამდენიმე ატრიბუტს (ამ შემთხვევაში მას ე.წ კომპოზიტური) - იხილეთ, მაგალითად, ურთიერთობა CHILDREN ნაჩვენები ნახ. 3.4 კითხვა 19. პარალელურად შემოდის ცნება სრული ფუნქციონალური დამოკიდებულება.

განმარტება:

არა გასაღების ატრიბუტი ფუნქციურად სრულად არის დამოკიდებული კომპოზიციურ გასაღებზე, თუ ის ფუნქციურად არის დამოკიდებული მთელ კლავიშზე, როგორც მთლიანზე, მაგრამ ფუნქციურად არ არის დამოკიდებული მის რომელიმე შემადგენელ ატრიბუტზე.

მაგალითი:

იყოს კავშირი SUPPLY (N_SUPPLIER, PRODUCT, PRICE).
მომწოდებელმა შეიძლება მიაწოდოს სხვადასხვა პროდუქცია და ერთი და იგივე პროდუქტი შეიძლება იყოს სხვადასხვა მომწოდებლის მიერ. მაშინ ურთიერთობის გასაღები არის "N_მომწოდებელი + პროდუქტი". დაე, ყველა მომწოდებელმა მიაწოდოს საქონელი იმავე ფასად. შემდეგ ჩვენ გვაქვს შემდეგი ფუნქციური დამოკიდებულებები:

  • N_მიმწოდებელი, პროდუქტი -> ფასი
  • პროდუქტი -> ფასი

ფასის ატრიბუტის არასრული ფუნქციონალური დამოკიდებულება გასაღებზე იწვევს შემდეგ ანომალიას: როდესაც საქონლის ფასი იცვლება, საჭიროა ურთიერთობის სრული ხედვა, რათა შეიცვალოს ყველა ჩანაწერი მისი მომწოდებლების შესახებ. ეს ანომალია არის შედეგი იმისა, რომ ორი სემანტიკური ფაქტი გაერთიანებულია მონაცემთა ერთ სტრუქტურაში. შემდეგი გაფართოება იძლევა ურთიერთობებს 2NF-ში:

  • მიწოდება (N_SUPPLIER, PRODUCT)
  • PRODUCT_PRICE (PRODUCT, PRICE)

ასე რომ თქვენ შეგიძლიათ მისცეს

მეორე ნორმალური ფორმის განმარტება: კავშირი არის 2NF-ში, თუ ის არის 1NF-ში და ყოველი არა გასაღების ატრიბუტი სრულად ფუნქციურად არის დამოკიდებული გასაღებზე.

21. 3NF: ძირითადი განმარტებებიდა ტრანსფორმაციის წესები.

მესამე ნორმალური ფორმის განხილვამდე აუცილებელია კონცეფციის გაცნობა: გარდამავალი ფუნქციური დამოკიდებულება.

განმარტება:

მოდით X, Y, Z იყოს რაღაც ურთიერთობის სამი ატრიბუტი. ამ შემთხვევაში X --> Y და Y --> Z, მაგრამ არ არსებობს საპირისპირო შესაბამისობა, ე.ი. Z -/-> Y და Y -/-> X. მაშინ Z ტრანზიტიულად არის დამოკიდებული X-ზე.
იყოს კავშირი STORAGE ( ფირმა, WAREHOUSE, VOLUME), რომელიც შეიცავს ინფორმაციას საწყობებიდან საქონლის მიმღები კომპანიებისა და ამ საწყობების მოცულობის შესახებ. ძირითადი ატრიბუტი - "მტკიცე". თუ თითოეულ კომპანიას შეუძლია მიიღოს საქონელი მხოლოდ ერთი საწყობიდან, მაშინ ამ მხრივ არსებობს შემდეგი ფუნქციონალური დამოკიდებულებები:

  • ფირმა -> მარაგი
  • მარაგი -> მოცულობა

ამ შემთხვევაში, ანომალიები წარმოიქმნება:

  • თუ ამ მომენტში არცერთი კომპანია არ იღებს საქონელს საწყობიდან, მაშინ მონაცემთა ბაზაში მისი მოცულობის შესახებ მონაცემების შეტანა შეუძლებელია (რადგან ძირითადი ატრიბუტი არ არის განსაზღვრული)
  • თუ საწყობის მოცულობა იცვლება, აუცილებელია მთელი ურთიერთობის ნახვა და ბარათების შეცვლა ამ საწყობთან დაკავშირებული ყველა კომპანიისთვის.

ამ ანომალიების აღმოსაფხვრელად აუცილებელია თავდაპირველი ურთიერთობის ორად დაყოფა:

  • შენახვა ( ფირმა, აქცია)
  • STORAGE_VOLUME ( საფონდო, ტომი)

მესამე ნორმალური ფორმის განმარტება:

კავშირი არის 3NF-ში, თუ ის არის 2NF-ში და ყოველი არა გასაღების ატრიბუტი ტრანზიტიულად არ არის დამოკიდებული პირველად გასაღებზე.

ადრე ამ წიგნში, ჩვენ აღვნიშნეთ გარკვეული ურთიერთობები, რომლებიც არსებობს ტიპიური ცხრილების გარკვეულ ველებს შორის. მომხმარებელთა ცხრილის snum ველი, მაგალითად, შეესაბამება snum ველს გამყიდველების ცხრილსა და შეკვეთების ცხრილში. კლიენტების ცხრილის cnum ველი ასევე შეესაბამება Orders ცხრილის cnum ველს. ჩვენ ვუწოდეთ ამ ტიპის ურთიერთობის მიმართვის მთლიანობა; და დისკუსიის დროს თქვენ ნახეთ, როგორ შეიძლება მისი გამოყენება.

ამ თავში თქვენ უფრო დეტალურად შეისწავლით მითითების მთლიანობას და შეიტყობთ ყველაფერს იმ შეზღუდვების შესახებ, რომელთა გამოყენებაც შეგიძლიათ მის შესანარჩუნებლად. თქვენ ასევე ნახავთ, როგორ მოქმედებს ეს შეზღუდვა, როდესაც იყენებთ DML მოდიფიკაციის ბრძანებებს. იმის გამო, რომ მითითების მთლიანობა მოიცავს ველების ან ველების ჯგუფების დაკავშირებას, ხშირად სხვადასხვა ცხრილებში, ეს მოქმედება შეიძლება იყოს უფრო რთული, ვიდრე სხვა შეზღუდვები. ამ მიზეზით, კარგია მისი სრულად გაცნობა, მაშინაც კი, თუ არ გეგმავთ ცხრილების შექმნას. თქვენი მოდიფიკაციის ბრძანებები შეიძლება უფრო ეფექტური გახდეს მიმართვის მთლიანობის შეზღუდვის გამოყენებით (როგორც სხვა შეზღუდვები, მაგრამ მიმართვის მთლიანობის შეზღუდვა შეიძლება გავლენა იქონიოს ცხრილებზე, გარდა იმ ცხრილებისა, რომლებზეც ის არის განსაზღვრული), და შეკითხვის გარკვეული ფუნქციები, როგორიცაა შეერთება, განმეორებით სტრუქტურირებულია. ტერმინების მთლიანობის ურთიერთობებში (როგორც ხაზგასმულია მე-8 თავში).

უცხოური გასაღები და მშობლის გასაღები

როდესაც ერთი ცხრილის ველში ყველა მნიშვნელობა წარმოდგენილია სხვა ცხრილის ველში, ჩვენ ვამბობთ, რომ პირველი ველი ეხება მეორეს. ეს მიუთითებს პირდაპირ ურთიერთობაზე ორი ველის მნიშვნელობებს შორის. მაგალითად, კლიენტების ცხრილის თითოეულ მომხმარებელს აქვს snum ველი, რომელიც მიუთითებს გამყიდველზე, რომელიც მინიჭებულია გამყიდველების ცხრილში. შეკვეთების ცხრილში თითოეული შეკვეთისთვის არის ერთი და მხოლოდ ეს გამყიდველი და ერთი და მხოლოდ ეს მომხმარებელი. ეს ნაჩვენებია snum და cnum ველების გამოყენებით Orders ცხრილში.

როდესაც ცხრილის ერთი ველი ეხება მეორეს, მას უცხო გასაღები ეწოდება; ხოლო ველს, რომელსაც ის ეხება, ეწოდება მშობელი გასაღები. ასე რომ, მომხმარებელთა ცხრილის snum ველი არის უცხო გასაღები, ხოლო snum ველი, რომელსაც იგი მიუთითებს გამყიდველების ცხრილში, არის მთავარი გასაღები.

ანალოგიურად, შეკვეთების ცხრილის cnum და snum ველები არის უცხოური გასაღებები, რომლებიც ეხება მათ მშობელ გასაღებებს, რომლებიც დასახელებულია კლიენტების ცხრილში და გამყიდველების ცხრილში. უცხოური გასაღების და მშობლის გასაღების სახელები არ უნდა იყოს იგივე, ეს მხოლოდ კონვენციაა, რომელსაც ჩვენ მივყვებით, რომ შეერთება უფრო ნათელი გახდეს.

მრავალსვეტიანი უცხოური გასაღებები

სინამდვილეში, უცხო გასაღები სულაც არ შედგება მხოლოდ ერთი სქესისგან. პირველადი გასაღების მსგავსად, უცხოურ გასაღებს შეიძლება ჰქონდეს ნებისმიერი რაოდენობის ველი, რომელიც განიხილება როგორც ერთიანი. უცხო გასაღები და მშობელი გასაღები, რომელსაც ის მიუთითებს, რა თქმა უნდა, უნდა ჰქონდეთ იგივე ნომერი და სქესის ტიპი და იყოს იგივე თანმიმდევრობით. ერთი სქესისგან შემდგარი უცხოური გასაღებები - ის, რასაც ექსკლუზიურად ვიყენებდით ჩვენს სტანდარტულ ცხრილებში, ყველაზე გავრცელებულია. იმისათვის, რომ ჩვენი განხილვა მარტივი იყოს, ჩვენ ხშირად მოვიხსენიებთ უცხო კლავიშს, როგორც ერთ სვეტს. ეს შემთხვევითი არ არის. თუ ეს არ არის აღნიშნული, ვინმე იტყვის ველზე, რომელიც არის უცხო გასაღები, რომ ის ასევე ეკუთვნის ველების ჯგუფს, რომელიც არის უცხო გასაღები.

უცხო და მშობლების გასაღებების მნიშვნელობა

როდესაც ველი არის უცხო გასაღები, ის გარკვეულწილად დაკავშირებულია ცხრილთან, რომელსაც ის ეხება. რასაც თქვენ არსებითად ამბობთ არის "ყველა მნიშვნელობა ამ ველში (უცხოური გასაღები) პირდაპირ არის დაკავშირებული სხვა ველში არსებულ მნიშვნელობასთან (მშობლის გასაღები)." უცხო გასაღების თითოეული მნიშვნელობა (თითოეული მწკრივი) ცალსახად უნდა ეხებოდეს მშობელი გასაღების ერთ და მხოლოდ ამ მნიშვნელობას (რიგს). თუ ეს ასეა, მაშინ სინამდვილეში თქვენი სისტემა, როგორც ამბობენ, იქნება საცნობარო მთლიანობის მდგომარეობაში. ამის ნახვა შეგიძლიათ მაგალითით. კლიენტების ცხრილში უცხო გასაღების snum-ს აქვს მნიშვნელობა 1001 რიგებისთვის Hoffman და Clemens. დავუშვათ, რომ გამყიდველების ცხრილში გვქონდა ორი სტრიქონი, ველის მნიშვნელობით snum = 1001. როგორ გავიგოთ, რომელ მომწოდებლებს მიენიჭათ ჰოფმანი და კლემენსი? ანალოგიურად, თუ ასეთი რიგები არ არის გამყიდველების ცხრილში, ჩვენ მივიღებთ ჰოფმანს და კლემენსს, რომლებიც მინიჭებულნი არიან გამყიდველზე, რომელიც არ არსებობს!

ცხადია, რომ უცხო გასაღების თითოეული მნიშვნელობა ერთხელ და მხოლოდ ერთხელ უნდა იყოს წარმოდგენილი მშობლის გასაღებში.

ფაქტობრივად, მოცემული უცხოური გასაღების მნიშვნელობა შეიძლება ეხებოდეს მხოლოდ ერთ მთავარ საკვანძო მნიშვნელობას, საპირისპირო შესაძლებლობის გარეშე: ე.ი. ნებისმიერი რაოდენობის უცხოური გასაღები შეიძლება მიუთითებდეს ერთი მშობლის გასაღების მნიშვნელობაზე. ამის ნახვა შეგიძლიათ ჩვენი მაგალითების ტიპურ ცხრილებში. ორივე ჰოფმანი და კლემენსი მინიჭებულია Peel-ზე, ამიტომ მათი ორივე უცხო გასაღების მნიშვნელობა იგივეა, რაც იგივე მშობლის გასაღები, რაც კარგია. უცხო გასაღების მნიშვნელობა უნდა მიუთითებდეს მხოლოდ ერთ მთავარ მნიშვნელობაზე, მაგრამ ძირითადი გასაღების მნიშვნელობა შეიძლება მინიშნება იყოს ნებისმიერი რაოდენობის უცხო გასაღების მნიშვნელობებით. ილუსტრაციისთვის, უცხოური გასაღების მნიშვნელობები კლიენტების ცხრილიდან, რომლებიც ემთხვევა მათ მთავარ გასაღებს გამყიდველების ცხრილში, ნაჩვენებია სურათზე 19.1. მოხერხებულობისთვის, ჩვენ არ გავითვალისწინეთ სქესი, რომელიც არ შეესაბამება ამ მაგალითს.

უცხოური გასაღების შეზღუდვა

SQL ინარჩუნებს რეფერენციალურ მთლიანობას FOREIGN KEY შეზღუდვით. მიუხედავად იმისა, რომ FOREIGN KEY შეზღუდვა არის ახალი ფუნქცია SQL-ში, ის ჯერ კიდევ არ ხდის მას უნივერსალურს. გარდა ამისა, ზოგიერთი მისი განხორციელება უფრო რთულია, ვიდრე სხვები. ამ ფუნქციამ უნდა შეზღუდოს მნიშვნელობები, რომლებიც შეგიძლიათ შეიყვანოთ თქვენს მონაცემთა ბაზაში, რათა აიძულოთ უცხო გასაღები და მშობელი გასაღები შეესაბამებოდეს რეფერენციულ მთლიანობას. საგარეო გასაღების შეზღუდვის ერთ-ერთი მოქმედება არის მნიშვნელობების გაუქმება იმ ველებისთვის, რომლებიც შემოიფარგლება როგორც უცხო გასაღები, რომლებიც უკვე არ არის წარმოდგენილი მშობლის გასაღებში. ეს შეზღუდვა ასევე გავლენას ახდენს მშობლის გასაღების მნიშვნელობების შეცვლის ან წაშლის უნარზე (ამას მოგვიანებით განვიხილავთ ამ თავში).

როგორ შეიძლება ველები იყოს წარმოდგენილი როგორც უცხოური გასაღებები

თქვენ იყენებთ უცხო გასაღების შეზღუდვას CREATE TABLE (ან ALTER TABLE) ბრძანებაში, რომელიც შეიცავს ველს, რომლის გამოცხადებაც გსურთ, როგორც უცხო გასაღები. თქვენ აძლევთ მათ მშობლის გასაღებს, რომელსაც მიმართავთ FOREIGN KEY შეზღუდვის შიგნით. ბრძანებაში ამ შეზღუდვის განთავსება იგივეა, რაც წინა თავში განხილული სხვა შეზღუდვებისთვის. სურათი 19.1: კლიენტის ცხრილის უცხოური გასაღები მშობელი გასაღებით

შეზღუდვების უმეტესობის მსგავსად, ეს შეიძლება იყოს ცხრილის ან სვეტის შეზღუდვა, ცხრილის სახით, რომელიც საშუალებას გაძლევთ გამოიყენოთ მრავალი ველი, როგორც ერთი უცხო გასაღები.

უცხოური გასაღები, როგორც ცხრილის შეზღუდვა

FOREIGN KEY ცხრილის შეზღუდვის სინტაქსი: FOREIGN KEY ლიტერატურა [ ] პირველი სვეტის სია არის მძიმით გამოყოფილი სია ცხრილის ერთი ან მეტი სვეტისა, რომელიც შეიქმნება ან შეიცვლება ამ ბრძანებით. Pktable არის ცხრილი, რომელიც შეიცავს მშობლის გასაღებს. ეს შეიძლება იყოს ცხრილი, რომელიც შექმნილია ან შეცვლილია მიმდინარე ბრძანებით. სვეტების მეორე სია არის სვეტების სია, რომლებიც შეადგენენ მშობლის გასაღებს. ორი სვეტის სია უნდა იყოს თავსებადი, ე.ი.

* მათ უნდა ჰქონდეთ სვეტების იგივე რაოდენობა.

* ამ თანმიმდევრობით, უცხო გასაღების სვეტების სიის პირველ, მეორე, მესამე და ა.შ. სვეტებს უნდა ჰქონდეთ იგივე მონაცემთა ტიპები და ზომები, როგორც პირველი, მეორე, მესამე და ა.შ., მშობელი გასაღების სვეტების სიის სვეტები. ორივე სვეტის სიებში სვეტებს არ უნდა ჰქონდეთ ერთი და იგივე სახელები, თუმცა ეს მეთოდი გამოვიყენეთ ჩვენს მაგალითებში ურთიერთობის გასაგებად.

მოდით შევქმნათ კლიენტების ცხრილი snum ველით განსაზღვრული, როგორც უცხო გასაღები, რომელიც მიუთითებს გამყიდველების ცხრილზე: CREATE TABLE კლიენტები (cnum მთელი რიცხვი NOT NULL ძირითადი გასაღები cname char(10), ქალაქის char(10), snum მთელი რიცხვი, უცხო გასაღები (snum) ცნობები გამყიდველები (snum) გაითვალისწინეთ, რომ CREATE TABLE-ის ნაცვლად ALTER TABLE-ის გამოყენებისას, უცხოური გასაღების შეზღუდვის გამოსაყენებლად, თქვენ მიერ მითითებული მნიშვნელობები უცხოურ გასაღებში და მშობლის გასაღებში უნდა იყოს მიმართვის მთლიანობის მდგომარეობაში, წინააღმდეგ შემთხვევაში, ALTER TABLE ბრძანება უარყოფილი იქნება - მისი მოხერხებულობისთვის, თქვენ უნდა ჩამოაყალიბოთ სტრუქტურული პრინციპები, როგორიცაა მიმართვის მთლიანობა, ყოველთვის, როდესაც ეს შესაძლებელია.

უცხოური გასაღები, როგორც სვეტის შეზღუდვა

სვეტის FOREIGN KEY შეზღუდვით შეზღუდვის ვარიანტს ასევე უწოდებენ REFERENCES შეზღუდვას, რადგან ის რეალურად არ შეიცავს სიტყვებს FOREIGN KEY, არამედ უბრალოდ იყენებს სიტყვას REFERENCES, რასაც მოჰყვება მთავარი გასაღები, ასე: CREATE TABLE Customers ( cnum მთელი რიცხვი NOT NULL PRIMARY KEY, cname char(10), city char(10), snum მთელი რიცხვი ბმულები გამყიდველები (snum)); ზემოაღნიშნული განსაზღვრავს Customers.snum-ს, როგორც უცხოურ გასაღებს, რომლის მთავარი გასაღები არის Salespeople.snum. ეს ექვივალენტურია ცხრილის მსგავსი შეზღუდვისა: უცხოური გასაღები (snum) REGERENCES გამყიდველები (snum)

არ დააკონკრეტოთ ძირითადი გასაღების სვეტების სია

ცხრილზე ან სვეტზე FOREIGN KEY შეზღუდვის გამოყენებით, შეგიძლიათ გამოტოვოთ მშობელი გასაღების სვეტების სია, თუ მშობელ გასაღებს აქვს PRIMARY KEY შეზღუდვა. ბუნებრივია, მრავალი ველის მქონე კლავიშების შემთხვევაში, უცხო და პირველადი კლავიშების სვეტების თანმიმდევრობა უნდა ემთხვეოდეს და, ნებისმიერ შემთხვევაში, კვლავ მოქმედებს ორ კლავიშს შორის თავსებადობის პრინციპი. მაგალითად, თუ მოვათავსებთ PRIMARY KEY შეზღუდვას გაყიდვების ცხრილის snum ველში, შეგვიძლია გამოვიყენოთ ის როგორც უცხო გასაღები კლიენტების ცხრილში (წინა მაგალითის მსგავსად) ამ ბრძანებით: CREATE TABLE Customers (cnum მთელი რიცხვი NOT NULL). PRIMARY KEY, cname char(10) , city char(10), snum integer REFERENCES Salespeople); ეს ფუნქცია ჩაშენებულია ენაში, რათა წაახალისოთ, გამოიყენოთ ძირითადი გასაღებები მშობლის გასაღებად.

როგორ ზღუდავს რეფერენციის მთლიანობა მშობლის გასაღების მნიშვნელობებს

რეფერენტული მთლიანობის შესანარჩუნებლად საჭიროა გარკვეული შეზღუდვები იმ მნიშვნელობებზე, რომლებიც შეიძლება იყოს წარმოდგენილი ველებში, რომლებიც გამოცხადებულია როგორც უცხოური გასაღები და მშობელი გასაღები. მთავარი გასაღები უნდა იყოს სტრუქტურირებული ისე, რომ თითოეული უცხო გასაღების მნიშვნელობა შეესაბამება ერთ მითითებულ მწკრივს. ეს ნიშნავს, რომ ის (გასაღები) უნდა იყოს უნიკალური და არ შეიცავდეს ცარიელ მნიშვნელობებს (NULL). ეს არ არის საკმარისი ძირითადი გასაღებისთვის, თუ იგივე მოთხოვნა დაკმაყოფილებულია, როგორც უცხო გასაღების გამოცხადებისას. SQL უნდა უზრუნველყოს, რომ ორმაგი ან ნულოვანი მნიშვნელობები არ არის შეყვანილი მშობლის გასაღებში. ამიტომ, თქვენ უნდა დარწმუნდეთ, რომ ყველა ველს, რომელიც გამოიყენება როგორც მშობლის გასაღებები, აქვს ან PRIMARY KEY შეზღუდვა ან UNIQUE შეზღუდვა, როგორიცაა NOT NULL შეზღუდვა.

პირველადი გასაღები, როგორც უნიკალური უცხოური გასაღები

თქვენი უცხოური გასაღებების დაკავშირება მხოლოდ ძირითად გასაღებებთან, როგორც ეს გავაკეთეთ სტანდარტულ ცხრილებში, კარგი სტრატეგიაა. როდესაც იყენებთ უცხო გასაღებებს, თქვენ არ აკავშირებთ მათ მხოლოდ იმ მშობელ გასაღებებთან, რომლებსაც ისინი მიმართავენ; თქვენ მათ უკავშირებთ ცხრილის კონკრეტულ მწკრივს, სადაც იქნება ნაპოვნი მშობელი გასაღები. თავად მშობელი გასაღები არ იძლევა ინფორმაციას, რომელიც უკვე არ არის უცხოურ გასაღებში. მაგალითად, სქესის snum-ის, როგორც უცხო გასაღების მომხმარებელთა ცხრილის მნიშვნელობა არის ის კავშირი, რომელიც მას აწვდის არა სქესის snum-ის მნიშვნელობას, რომელსაც ის ეხება, არამედ გაყიდვების ცხრილის სხვა ინფორმაციას, როგორიცაა სახელები. გამყიდველები, მათი ადგილმდებარეობა და ა.შ. უცხო გასაღები არ არის უბრალოდ ურთიერთობა ორ იდენტურ მნიშვნელობას შორის; ეს არის ურთიერთობა, ამ ორი მნიშვნელობის გამოყენებით, მოთხოვნაში მითითებულ ცხრილის ორ რიგს შორის. ეს snum ველი შეიძლება გამოყენებულ იქნას კლიენტების ცხრილიდან ნებისმიერი ინფორმაციის ზედიზედ დასაკავშირებლად გამყიდველების ცხრილის საცნობარო მწკრივთან - მაგალითად, იმის გასარკვევად, ცხოვრობენ თუ არა ისინი იმავე ქალაქში, ვის აქვს უფრო გრძელი სახელი, აქვს თუ არა გამყიდველს ნებისმიერი სხვა კლიენტი გარდა ამ მომხმარებლის კლიენტებისა და ა.შ. ვინაიდან პირველადი გასაღების დანიშნულებაა მწკრივის უნიკალურობის იდენტიფიცირება, ეს უფრო ლოგიკური და ნაკლებად ორაზროვანი არჩევანია უცხო გასაღებისთვის. ნებისმიერი უცხო გასაღებისთვის, რომელიც იყენებს უნიკალურ გასაღებს, როგორც მის მთავარ გასაღებს, თქვენ უნდა შექმნათ უცხო გასაღები, რომელიც იყენებს იმავე ცხრილის ძირითად გასაღებს იმავე ეფექტისთვის. უცხო გასაღები, რომელსაც სხვა დანიშნულება არ აქვს გარდა რიგების დაკავშირებისა, მსგავსია პირველადი გასაღებისა, რომელიც გამოიყენება მხოლოდ რიგების იდენტიფიცირებისთვის და კარგი გზაა თქვენი მონაცემთა ბაზის სტრუქტურის მკაფიო და მარტივი შესანარჩუნებლად და, შესაბამისად, ნაკლებად რთული.

საგარეო ძირითადი შეზღუდვები

უცხო გასაღები, კერძოდ, შეიძლება შეიცავდეს მხოლოდ მნიშვნელობებს, რომლებიც რეალურად არის მშობლის გასაღებში ან ცარიელია (NULL). ამ კლავიშში სხვა მნიშვნელობების შეყვანის ნებისმიერი მცდელობა უარყოფილი იქნება. თქვენ შეგიძლიათ გამოაცხადოთ უცხო გასაღები, როგორც NOT NULL, მაგრამ ეს არ არის აუცილებელი და უმეტეს შემთხვევაში არასასურველია. მაგალითად, დავუშვათ, რომ თქვენ შედიხართ კლიენტს ისე, რომ წინასწარ არ იცოდეთ, რომელ გამყიდველზე დაინიშნება. ამ სიტუაციაში საუკეთესო გამოსავალი არის NOT NULL მნიშვნელობის გამოყენება, რომელიც მოგვიანებით უნდა შეიცვალოს კონკრეტულ მნიშვნელობაზე.

რა მოხდება, თუ თქვენ შეასრულებთ მოდიფიკაციის ბრძანებას

მოდით განვსაზღვროთ, რომ ჩვენს მაგალითების ცხრილებში შექმნილი ყველა უცხოური გასაღები დეკლარირებულია და სრულდება უცხო გასაღების შეზღუდვებით, შემდეგნაირად: CREATE TABLE გამყიდველები (snum მთელი რიცხვი NOT NULL PRIMARY KEY, sname char (10) NOT NULL, city char (10) , comm ათობითი ); შექმენით ცხრილი კლიენტები (cnum მთელი რიცხვი NOT NULL ძირითადი გასაღები, cname char(10) NOT NULL, ქალაქის სიმბოლო (10), რეიტინგი მთელი რიცხვი, snum მთელი რიცხვი, უცხოური გასაღები (snum) ბმულები გამყიდველები, უნიკალური (cnum, snum, snum) cnum მთელი რიცხვი NOT NULL ძირითადი გასაღები, amt ათობითი, თარიღი NOT NULL, cnum მთელი რიცხვი NOT NULL snum მთელი რიცხვი NOT NULL უცხო გასაღები (cnum, snum) მითითებები კლიენტები (cnum, snum);

ცხრილის აღწერილობების ჩათვლით

ასეთი განმარტებების რამდენიმე ატრიბუტია, რომლებიც განხილვას საჭიროებს. მიზეზი, რის გამოც გადავწყვიტეთ შეკვეთების ცხრილის cnum და snum იატაკები გაგვეკეთებინა ერთ უცხოურ გასაღებად, არის იმის უზრუნველსაყოფად, რომ შეკვეთებში შემავალი თითოეული მომხმარებლისთვის, გამყიდველი, რომელიც ამ შეკვეთას აკრედიტებს, იგივე იყოს, რაც მითითებულია კლიენტების ცხრილში. ასეთი უცხო გასაღების შესაქმნელად, ჩვენ უნდა დავაყენოთ UNIQUE ცხრილის შეზღუდვა კლიენტის მაგიდის ორ სართულზე, მიუხედავად იმისა, რომ ეს არ არის საჭირო თავად ცხრილის მიერ. სანამ ამ ცხრილის cnum ველს აქვს PRIMARY KEY შეზღუდვა, ის ნებისმიერ შემთხვევაში იქნება უნიკალური და, შესაბამისად, შეუძლებელია cnum ველის სხვა კომბინაციის მიღება სხვა ველთან. ამ გზით უცხო გასაღების შექმნა ინარჩუნებს მონაცემთა ბაზის მთლიანობას, მაშინაც კი, თუ ეს ხელს შეგიშლით შეცდომით შეცვალოთ შიგადაშიგ და დააკრედიტოთ ნებისმიერი გამყიდველი, გარდა ამ კონკრეტული მომხმარებლისთვის მინიჭებული.

მონაცემთა ბაზის მთლიანობის შენარჩუნების თვალსაზრისით, შიდა შეფერხებები (ან გამონაკლისები) რა თქმა უნდა არასასურველია. თუ მათ ნებას რთავთ და ამავდროულად გსურთ თქვენი მონაცემთა ბაზის მთლიანობის შენარჩუნება, შეგიძლიათ გამოაცხადოთ snum და cnum ველები Orders ცხრილში, როგორც ამ ველების დამოუკიდებელი უცხოური გასაღებები, შესაბამისად, მომწოდებლების ცხრილში და კლიენტების ცხრილში. სინამდვილეში, სექს სნუმის გამოყენება Order ცხრილში, როგორც ჩვენ გავაკეთეთ, არ არის აუცილებელი, თუმცა სასარგებლოა ამის გაკეთება მრავალფეროვნებისთვის. cnum ველი, რომელიც აკავშირებს თითოეულ კლიენტის შეკვეთას მომხმარებელთა ცხრილში, შეკვეთების ცხრილში და კლიენტების ცხრილში ყოველთვის უნდა იყოს გაზიარებული, რათა იპოვოთ სწორი snum ველი ამ შეკვეთისთვის (გამონაკლისების დაშვების გარეშე). ეს ნიშნავს, რომ ჩვენ ვაწერთ ინფორმაციას - რომელ მომხმარებელს რომელ გამყიდველს აქვს მინიჭებული - ორჯერ და დამატებითი სამუშაო იქნება საჭირო იმისათვის, რომ დავრწმუნდეთ, რომ ორივე ვერსია შეესაბამება. თუ ჩვენ არ გვაქვს უცხოური გასაღების შეზღუდვა, როგორც ზემოთ აღინიშნა, ეს სიტუაცია განსაკუთრებით პრობლემური იქნება, რადგან თითოეული შეკვეთა უნდა შემოწმდეს ხელით (მოკითხვასთან ერთად), რათა დარწმუნდეს, რომ შესაბამისმა გამყიდველმა დააკრედიტა თითოეული შესაბამისი გაყიდვა. ამ ტიპის ინფორმაციის სიჭარბის არსებობას თქვენს მონაცემთა ბაზაში ეწოდება დენორმალიზაცია, რაც არასასურველია იდეალურ რელაციურ მონაცემთა ბაზაში, თუმცა პრაქტიკაში მისი მოგვარება შესაძლებელია. დემორალიზებამ შეიძლება გამოიწვიოს გარკვეული მოთხოვნების უფრო სწრაფად გაშვება, რადგან მოთხოვნა ერთ მაგიდაზე ყოველთვის ბევრად უფრო სწრაფია, ვიდრე მოთხოვნა შეერთებისას.

შეზღუდვების გამოყენება

როგორ მოქმედებს ასეთი შეზღუდვები თქვენს უნარზე და უუნარობაზე, გამოიყენოთ DML მოდიფიკაციის ბრძანებები? უცხო კლავიშებად განსაზღვრულ ველებზე პასუხი საკმაოდ მარტივია: ნებისმიერი მნიშვნელობა, რომელიც თქვენ ჩასვით ამ ველებში INSERT ან UPDATE ბრძანებით, უკვე უნდა იყოს წარმოდგენილი მათ მშობელ გასაღებებში. თქვენ შეგიძლიათ განათავსოთ NULL მნიშვნელობები ამ ველებში, თუმცა NULL მნიშვნელობები დაუშვებელია მშობლის გასაღებებში, თუ მათ აქვთ NOT NULL შეზღუდვა. თქვენ შეგიძლიათ წაშალოთ ნებისმიერი მწკრივი უცხო კლავიშებით მშობელი კლავიშების გამოყენების გარეშე.

მას შემდეგ, რაც დაისვა მთავარი გასაღების მნიშვნელობების შეცვლის საკითხი, პასუხი, როგორც განსაზღვრულია ANSI-ის მიერ, კიდევ უფრო მარტივია, მაგრამ შესაძლოა გარკვეულწილად უფრო შეზღუდული: ნებისმიერი მშობელი გასაღების მნიშვნელობა, რომელიც მითითებულია უცხო გასაღების მნიშვნელობით, არ შეიძლება წაიშალოს ან შეიცვალოს. ეს ნიშნავს, მაგალითად, რომ თქვენ არ შეგიძლიათ კლიენტის ამოღება მომხმარებელთა ცხრილიდან, სანამ მას ჯერ კიდევ აქვს შეკვეთები შეკვეთების ცხრილში. იმისდა მიხედვით, თუ როგორ იყენებთ ამ ცხრილებს, ეს შეიძლება იყოს სასურველი ან რთული. თუმცა, ეს, რა თქმა უნდა, უკეთესია, ვიდრე სისტემა, რომელიც საშუალებას გაძლევთ წაშალოთ კლიენტი მიმდინარე შეკვეთებით და დატოვოთ შეკვეთების ცხრილი არარსებულ მომხმარებლებზე მითითებით. ამ შეზღუდვის სისტემის აზრი იმაში მდგომარეობს, რომ შეკვეთების ცხრილის შემქმნელს, მომხმარებელთა ცხრილის და გამყიდველების ცხრილის გამოყენებით, როგორც ძირითადი გასაღებები, შეუძლია დააწესოს მნიშვნელოვანი შეზღუდვები ამ ცხრილების მოქმედებებზე. ამ მიზეზით, თქვენ ვერ შეძლებთ გამოიყენოთ ცხრილი, რომელსაც თქვენ არ აკონტროლებთ (ანუ თქვენ არ შეგიქმნიათ და არ ხართ მისი მფლობელი), სანამ ამ ცხრილის მფლობელი (შემქმნელი) კონკრეტულად არ მოგცემთ ამის უფლებას. ასე (როგორც 22-ე თავშია ახსნილი). არსებობს სხვა შესაძლო მშობელი გასაღების შეცვლის მოქმედებები, რომლებიც არ არის ANSI-ის ნაწილი, მაგრამ შეიძლება მოიძებნოს ზოგიერთ კომერციულ პროგრამაში. თუ გსურთ შეცვალოთ ან წაშალოთ მშობელი გასაღების მიმდინარე საცნობარო მნიშვნელობა, არსებითად არსებობს სამი შესაძლებლობა:

  • თქვენ შეგიძლიათ შეზღუდოთ ან აკრძალოთ ცვლილებები (ANSI რეჟიმში) იმის მითითებით, რომ მშობლის გასაღების ცვლილებები შეზღუდულია.
  • თქვენ შეგიძლიათ შეიტანოთ ცვლილება მშობლის გასაღებში და ამით შეიტანოთ ცვლილებები უცხო გასაღებში ავტომატურად, რასაც კასკადური ცვლილება ეწოდება.
  • თქვენ შეგიძლიათ შეცვალოთ მშობელი გასაღები და დააყენოთ უცხოური გასაღები NULL ავტომატურად (თუ ვივარაუდებთ, რომ NULLS დაშვებულია უცხოურ გასაღებში), რასაც ეწოდება null საგარეო გასაღების შეცვლა.

    ამ სამი კატეგორიის ფარგლებშიც კი, შეიძლება არ გინდოდეთ ყველა მოდიფიკაციის ბრძანების ამ გზით დამუშავება. INSERT, რა თქმა უნდა, შეუსაბამოა. ის ათავსებს მშობლის გასაღების ახალ მნიშვნელობებს ცხრილში ისე, რომ არცერთი ამ მნიშვნელობის გამოძახება არ შეიძლება მომენტში. თუმცა, შეიძლება დაგჭირდეთ ცვლილებების კასკადის დაშვება წაშლის გარეშე და პირიქით. უკეთესი სიტუაცია შეიძლება იყოს ის, რომელიც საშუალებას მოგცემთ განსაზღვროთ სამი კატეგორიიდან რომელიმე, განახლების და DELETE ბრძანებებისგან დამოუკიდებლად. ამიტომ, ჩვენ მივმართავთ განახლების ეფექტებს და წაშლის ეფექტებს, რომლებიც განსაზღვრავს რა მოხდება, თუ თქვენ გასცემთ განახლების ან DELETE ბრძანებას მშობლის გასაღებზე. ამ ეფექტებს, რომელზეც ჩვენ ვისაუბრეთ, ეწოდება: შეზღუდული ცვლილებები, CASCADES ცვლილებები და NULL ცვლილებები. თქვენი სისტემის რეალური შესაძლებლობები უნდა იყოს მკაცრი ANSI სტანდარტის ფარგლებში - მოდიფიკაციის და წაშლის ეფექტები ორივე ავტომატურად შეზღუდულია - ზემოთ აღწერილი უფრო იდეალური სიტუაციისთვის. საილუსტრაციოდ, ჩვენ გაჩვენებთ რამდენიმე მაგალითს, თუ რისი გაკეთება შეგიძლიათ მოდიფიკაციისა და მოცილების ეფექტების სრული სპექტრით. რა თქმა უნდა, მოდიფიკაციისა და წაშლის ეფექტებს, რომლებიც არასტანდარტული საშუალებებია, აკლია სტანდარტული მდგომარეობის სინტაქსი. სინტაქსი, რომელსაც აქ ვიყენებთ, მარტივი დასაწერია და შემდგომში ამ ეფექტების ფუნქციების ილუსტრირებას ემსახურება.

    ექსპერიმენტის სისრულისთვის, დავუშვათ, რომ თქვენ გაქვთ მიზეზი, შეცვალოთ გამყიდველების ცხრილის snum ველი იმ შემთხვევაში, როდესაც ჩვენი გამყიდველების ცხრილი ცვლის დანაყოფებს. (როგორც წესი, პირველადი გასაღებების შეცვლა არ არის ის, რასაც ჩვენ გირჩევთ პრაქტიკაში. ეს არის კიდევ ერთი მიზეზი არსებული ძირითადი გასაღებებისთვის, რომლებმაც არ იციან როგორ გააკეთონ სხვა რამ, გარდა ძირითადი გასაღებების მოქმედებისა: ისინი არ უნდა შეიცვალოს.) როდესაც თქვენ შეცვლით მოვაჭარს. ნომერი, გსურთ მისი ყველა მომხმარებლის შენახვა. თუმცა, თუ ეს გამყიდველი ტოვებს თავის ფირმას ან კომპანიას, შეიძლება არ გინდოდეთ მისი კლიენტების ამოღება მონაცემთა ბაზიდან ამოღებისას. ამის ნაცვლად, თქვენ გინდათ დარწმუნდეთ, რომ კლიენტები სხვას ენიჭებათ. ამისათვის თქვენ უნდა მიუთითოთ UPDATE კასკადური ეფექტით და DELETE შეზღუდული ეფექტით. CREATE TABLE კლიენტები (cnum მთელი რიცხვი NOT NULL PRIMARY KEY, cname char(10) NOT NULL, city char(10), რეიტინგი მთელი რიცხვი, snum მთელი რიცხვი REFERENCES გამყიდველები, გამყიდველების განახლება CASCADES, DELETE OF Salespeed); თუ ახლა ცდილობთ ამოიღოთ Peel მომწოდებლების ცხრილიდან, ბრძანება არ იქნება მოქმედი მანამ, სანამ არ შეცვლით Hoffman-ისა და Clemens-ის კლიენტების სქესის snum მნიშვნელობას სხვა მინიჭებული გამყიდველისთვის. მეორეს მხრივ, თქვენ შეგიძლიათ შეცვალოთ სქესის snum მნიშვნელობა Peel-ისთვის 1009-მდე, ასევე ავტომატურად შეიცვლება ჰოფმანი და კლემენსი.

    მესამე ეფექტი არის ცარიელი (NULL) ცვლილებები. ეს ხდება, რომ როდესაც გამყიდველები ტოვებენ კომპანიას, მათი მიმდინარე შეკვეთები არ გადაეცემა სხვა გამყიდველს. მეორეს მხრივ, გსურთ ავტომატურად გააუქმოთ ყველა შეკვეთა იმ მომხმარებლებისთვის, რომელთა ანგარიშებს წაშლით. გამყიდველის ან მომხმარებლის ნომრების შეცვლით, შეგიძლიათ უბრალოდ გადასცეთ ისინი მას. ქვემოთ მოყვანილი მაგალითი გვიჩვენებს, თუ როგორ შეგიძლიათ შექმნათ შეკვეთის ცხრილი ამ ეფექტების გამოყენებით. CREATE TABLE შეკვეთები (მთლიანი რიცხვი NOT NULL ძირითადი გასაღები, amt ათწილადი, თარიღი NOT NULL რიცხვი NULL REFERENCES კლიენტები snum მთელი რიცხვი REFERENCES გამყიდველები, UPDATE OF Customers CASCADES, DELETE OFCADESSC, F გამყიდველები NULLS); რა თქმა უნდა, DELETE ბრძანებაში Vendors ცხრილზე Empty ცვლილების ეფექტით, NOT NULL შეზღუდვა უნდა მოიხსნას snum ველიდან.

    უცხოური გასაღებები, რომლებიც ასახავს მათ სუბიექტურ ცხრილებს

    როგორც უკვე აღვნიშნეთ, FOREIGN KEY შეზღუდვას შეუძლია წარმოადგინოს ეს პირადი ცხრილი, როგორც ძირითადი გასაღების ცხრილი. შორს არის მარტივი, მაგრამ ეს ფუნქცია შეიძლება სასარგებლო იყოს. დავუშვათ, რომ გვაქვს Employees ცხრილი მენეჯერის ველით. ეს ველი შეიცავს თითოეული თანამშრომლის ნომრებს, რომელთაგან ზოგიერთი ასევე ადმინისტრატორია. მაგრამ ვინაიდან ყველა ადმინისტრატორი ამავე დროს რჩება თანამშრომელი, ის, ბუნებრივია, წარმოდგენილი იქნება ამ ცხრილში. მოდით შევქმნათ ცხრილი, სადაც თანამშრომლის ნომერი (სვეტი სახელად empno) გამოცხადდება პირველად გასაღებად და ადმინისტრატორი, როგორც უცხო გასაღები, მიუთითებს მას: CREATE TABLE Employees (empno მთელი რიცხვი NOT NULL PRIMARY KEY, სახელი char(10) NOT NULL UNIOUE, მენეჯერი მთელი რიცხვი REFERENCES Employees); (რადგან უცხოური გასაღები არის ცხრილის მითითებული პირველადი გასაღები, სვეტების სია შეიძლება გამოირიცხოს.) არსებობს ამ ცხრილის შინაარსი: EMPNO NAME MANAGER _____ ________ _______ 1003 Terrence 2007 2007 Atali NULL 1688 2002 McKenna. ხედავთ, რომ თითოეული მათგანი (მაგრამ არა ატალი), მოიხსენიებს ცხრილში სხვა თანამშრომელს, როგორც მის ადმინისტრატორს. ატალი, რომელსაც აქვს ყველაზე მეტი რიცხვი ცხრილში, უნდა ჰქონდეს NULL მნიშვნელობა. ეს იძლევა რეფერენციული მთლიანობის სხვა პრინციპს. უცხოური გასაღები, რომელიც მიუთითებს პირად ცხრილზე, უნდა დაუშვას მნიშვნელობები = NULL. თუ ეს ასე არ არის, როგორ ჩასვამთ პირველ რიგს? მაშინაც კი, თუ ეს პირველი სტრიქონი თავის თავს ეხება, მშობელი გასაღების მნიშვნელობა უკვე უნდა იყოს დაყენებული უცხო გასაღების მნიშვნელობის შეყვანისას. ეს პრინციპი მართალი იქნება მაშინაც კი, თუ უცხოური გასაღები მიუთითებს პირად ცხრილზე არა პირდაპირ, არამედ სხვა ცხრილზე მითითებით, რომელიც შემდეგ ეხება უცხო გასაღების ცხრილს. მაგალითად, დავუშვათ, ჩვენს გაყიდვების ცხრილს აქვს დამატებითი ველი, რომელიც მიუთითებს კლიენტების ცხრილზე, ისე, რომ თითოეული ცხრილი მიუთითებს მეორეზე, როგორც ეს ნაჩვენებია CREATE TABLE-ის შემდეგ განცხადებაში: CREATE TABLE გამყიდველები (snum მთელი რიცხვი NOT NULL PRIMARY KEY, sname char(10) NOT NULL, city char(10), comm declmal, cnum integer REFERENCES Customers); CREATE TABLE კლიენტები (cnum მთელი რიცხვი NOT NULL PRIMARY KEY, cname char(10) NOT NULL, city char(10), რეიტინგი მთელი რიცხვი, snum მთელი რიცხვი ცნობები გამყიდველები); ამას ჯვარედინი მითითება ჰქვია. SQL მხარს უჭერს ამას თეორიულად, მაგრამ პრაქტიკაში ეს შეიძლება იყოს პრობლემა. ამ ორიდან რომელი ცხრილი შეიქმნა პირველი, არის საცნობარო ცხრილი, რომელიც ჯერ არ არსებობს მეორისთვის. ჯვარედინი მითითების ინტერესებიდან გამომდინარე, SQL რეალურად ამის საშუალებას იძლევა, მაგრამ არცერთი ცხრილი არ იქნება გამოსაყენებელი, სანამ ორივე შექმნის პროცესშია. მეორეს მხრივ, თუ ორი ცხრილი შექმნილია სხვადასხვა მომხმარებლის მიერ, პრობლემა კიდევ უფრო რთულდება. ჯვარედინი მითითება შეიძლება იყოს სასარგებლო ინსტრუმენტი, მაგრამ ეს არ არის გაურკვევლობისა და საშიშროების გარეშე. წინა მაგალითი, მაგალითად, არ არის მთლიანად გამოსაყენებელი, რადგან ის ზღუდავს გამყიდველს ერთი მომხმარებლისთვის და ამის მისაღწევად არ არის აუცილებელი ჯვარედინი მითითების გამოყენება. ჩვენ გირჩევთ იყოთ ფრთხილად მის გამოყენებაში და გაანალიზოთ, თუ როგორ მართავს თქვენი პროგრამები მოდიფიკაციისა და წაშლის ეფექტებს, ასევე პრივილეგიების და ინტერაქტიული შეკითხვის დამუშავების პროცესებს, სანამ შექმნით ჯვარედინი მთლიანობის სისტემას. (პრივილეგიები და მოთხოვნის ინტერაქტიული დამუშავება განხილული იქნება, შესაბამისად, 22 და 1 თავებში.)

    ᲨᲔᲛᲐᲯᲐᲛᲔᲑᲔᲚᲘ

    თქვენ ახლა საკმაოდ კარგად აკონტროლებთ მითითების მთლიანობას. ძირითადი იდეა ისაა, რომ ყველა უცხოური გასაღების მნიშვნელობა ეხება მითითებულ მშობელი გასაღების რიგს. ეს ნიშნავს, რომ თითოეული უცხო გასაღების მნიშვნელობა უნდა იყოს წარმოდგენილი ერთხელ და მხოლოდ ერთხელ, მშობლის გასაღებში. როდესაც მნიშვნელობა მოთავსებულია უცხოურ გასაღებში, მთავარი გასაღები მოწმდება იმის უზრუნველსაყოფად, რომ მისი მნიშვნელობა წარმოდგენილია; წინააღმდეგ შემთხვევაში, ბრძანება უარყოფილი იქნება. მშობლის გასაღებს უნდა ჰქონდეს PRIMARY KEY ან UNIQUE შეზღუდვა, რათა დარწმუნდეს, რომ მნიშვნელობა არ არის წარმოდგენილი ერთზე მეტჯერ. მშობელი გასაღების მნიშვნელობის შეცვლის მცდელობა, რომელიც ამჟამად წარმოდგენილია უცხოურ გასაღებში, საერთოდ უარყოფილი იქნება. თუმცა, თქვენმა სისტემამ შეიძლება შემოგთავაზოთ არჩევანი, მიიღოთ უცხო გასაღების მნიშვნელობა NULL-ზე დაყენებული ან მიიღოთ ძირითადი გასაღების ახალი მნიშვნელობა და მიუთითოთ რომელი შეიძლება მიიღოთ დამოუკიდებლად UPDATE და DELETE ბრძანებებისთვის. ამით დასრულდა ჩვენი განხილვა CREATE TABLE ბრძანების შესახებ. შემდეგ ჩვენ გაგაცნობთ სხვა ტიპის ბრძანებას - CREATE. მე-20 თავში თქვენ შეისწავლით თუ როგორ უნდა წარმოადგინოთ მონაცემთა ობიექტები, რომლებიც გამოიყურებიან და მოქმედებენ როგორც ცხრილი, მაგრამ რეალურად არიან შეკითხვის შედეგები. ზოგიერთი შეზღუდვის ფუნქცია ასევე შეიძლება შესრულდეს ხედებით, ასე რომ თქვენ შეძლებთ უკეთ შეაფასოთ შეზღუდვების საჭიროება შემდეგი სამი თავის წაკითხვის შემდეგ.

    SQL-თან მუშაობა

    1. შექმენით ცხრილი სახელად Cityorders. ის უნდა შეიცავდეს იგივე onum, amt და snum ველებს, როგორც Orders ცხრილი, და იგივე cnum და city ველები, როგორც კლიენტების ცხრილი, ასე რომ თითოეული მომხმარებლის შეკვეთა შეიტანება ამ ცხრილში თავის ქალაქთან ერთად. onum ველი იქნება Cityorders-ის ძირითადი გასაღები. Cityorders-ის ყველა სართულს უნდა ჰქონდეს შეზღუდვები კლიენტებისა და შეკვეთების ცხრილებთან შედარებით. შესაძლებელია, რომ ამ ცხრილების მშობლის გასაღებებს უკვე აქვთ შესაბამისი შეზღუდვები.

    2. გავართულოთ პრობლემა. ხელახლა განსაზღვრეთ შეკვეთების ცხრილი შემდეგნაირად: დაამატეთ ახალი სვეტი სახელწოდებით prev, რომელიც იქნება იდენტიფიცირებული თითოეული შეკვეთისთვის, წინა შეკვეთის onum ველი ამ მიმდინარე მომხმარებლისთვის. გააკეთეთ ეს უცხო გასაღების გამოყენებით, რომელიც მიუთითებს თავად Order ცხრილზე. უცხოური გასაღები ასევე უნდა მიუთითებდეს კლიენტის cnum ველზე, რომელიც უზრუნველყოფს კონკრეტულ დაწესებულ ურთიერთობას მიმდინარე შეკვეთასა და მითითებულს შორის.

    (პასუხებისთვის იხილეთ დანართი A.)

  • ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘგამოიყენება ბმულის შეზღუდვისთვის.
    როდესაც ერთი ცხრილის ველში ყველა მნიშვნელობა წარმოდგენილია სხვა ცხრილის ველში, ამბობენ, რომ პირველი ველი ეხება მეორეს. ეს მიუთითებს პირდაპირ ურთიერთობაზე ორი ველის მნიშვნელობებს შორის.

    როდესაც ცხრილში ერთი სქესი ეხება მეორეს, მას უწოდებენ უცხოური გასაღები; და ველი, რომელსაც ის ეხება, ეწოდება მშობლის გასაღები. უცხო გასაღებისა და მშობლის გასაღების სახელები არ უნდა იყოს იგივე. უცხოურ გასაღებს შეიძლება ჰქონდეს ველის ნებისმიერი რაოდენობა, რომელიც დამუშავდება როგორც ერთი ერთეული. უცხო გასაღებს და მშობლის გასაღებს, რომელსაც ის მიუთითებს, უნდა ჰქონდეთ ერთი და იგივე ველის ნომერი და ველის ტიპი და იყოს იგივე თანმიმდევრობით. როდესაც ველი არის უცხო გასაღები, ის გარკვეულწილად დაკავშირებულია იმ ცხრილთან, რომელსაც ის მიუთითებს. უცხო გასაღების თითოეული მნიშვნელობა (თითოეული მწკრივი) ცალსახად უნდა ეხებოდეს მშობელი გასაღების ერთ და მხოლოდ ამ მნიშვნელობას (რიგს). თუ ეს პირობა დაკმაყოფილებულია, მაშინ მონაცემთა ბაზა არის მდგომარეობაში რეფერენციული მთლიანობა.

    SQLინარჩუნებს რეფერენციალურ მთლიანობას შეზღუდვით ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ. ამ ფუნქციამ უნდა შეზღუდოს მნიშვნელობები, რომლებიც შეიძლება შეიტანოს მონაცემთა ბაზაში, რათა აიძულოს უცხო გასაღები და მშობელი გასაღები შეესაბამებოდეს რეფერენციულ მთლიანობას. შეზღუდვის ერთ-ერთი ქმედება ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘარის მნიშვნელობების ჩაშვება ველებისთვის, რომლებიც შემოიფარგლება როგორც უცხო გასაღები, რომელიც ჯერ არ არის წარმოდგენილი მშობლის გასაღებში. ეს შეზღუდვა ასევე გავლენას ახდენს მშობელი გასაღების მნიშვნელობების შეცვლის ან წაშლის უნარზე

    შეზღუდვა ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘგამოიყენება ბრძანებაში CREATE TABLE (ან ALTER TABLE (განზრახულია შეცვალოს ცხრილის სტრუქტურა)), რომელიც შეიცავს ველს, რომელიც გამოცხადებულია უცხო კლავიშად ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ.

    შეზღუდვების უმეტესობის მსგავსად, ეს შეიძლება იყოს ცხრილის ან სვეტის შეზღუდვა, ცხრილის სახით, რომელიც საშუალებას გაძლევთ გამოიყენოთ მრავალი ველი, როგორც ერთი უცხო გასაღები.

    ცხრილის შეზღუდვის სინტაქსი ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ:

    ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ ლიტერატურა

    [ ]

    პირველი სვეტის სია არის მძიმით გამოყოფილი სია ცხრილის ერთი ან მეტი სვეტისა, რომელიც შეიქმნება ან შეიცვლება ამ ბრძანებით.

    Pktable- ეს არის ცხრილი, რომელიც შეიცავს მშობლის გასაღებს. ეს შეიძლება იყოს ცხრილი, რომელიც შექმნილია ან შეცვლილია მიმდინარე ბრძანებით.

    მეორე სვეტის სია არის სვეტების სია, რომლებიც შეადგენენ მშობლის გასაღებს. ორი სვეტის სია უნდა იყოს თავსებადი, ე.ი.

    • აქვს იგივე რაოდენობის სვეტები
    • მოცემული თანმიმდევრობით, უცხო გასაღების სვეტების სიის პირველ, მეორე, მესამე და ა.შ. სვეტებს უნდა ჰქონდეთ მონაცემთა იგივე ტიპები და ზომები, როგორც პირველი, მეორე, მესამე და ა.შ., მშობელი გასაღების სვეტების სიის სვეტები.
    • ორივე სვეტის სიებში სვეტებს არ უნდა ჰქონდეს იგივე სახელები.

    საგარეო გასაღები მაგალითი 1

    მაგიდის შექმნა სტუდენტი
    (Kod_stud მთელი რიცხვი NOT NULL PRIMARY ᲒᲐᲡᲐᲦᲔᲑᲘ,
    Kod_spec მთელი რიცხვი NOT NULL,

    მისამართები char(50),
    ბურთი ათობითი),
    ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ(Kod_spec) ლიტერატურასპეციფიკაცია (Kod_spec)
    );

    შეზღუდვის გამოსაყენებლად CREATE TABLE-ის ნაცვლად ALTER TABLE-ის გამოყენებისას ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘუცხო გასაღებისა და მშობლის გასაღებში მითითებული მნიშვნელობები უნდა იყოს რეფერენციული მთლიანობის მდგომარეობაში. წინააღმდეგ შემთხვევაში ბრძანება უარყოფილი იქნება.

    შეზღუდვის გამოყენება ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘცხრილი ან სვეტი, შეგიძლიათ გამოტოვოთ მშობელი გასაღების სვეტების სია, თუ მშობლის გასაღებს აქვს PRIMARY შეზღუდვა ᲒᲐᲡᲐᲦᲔᲑᲘ. ბუნებრივია, მრავალი ველის მქონე კლავიშების შემთხვევაში, უცხო და პირველადი კლავიშების სვეტების თანმიმდევრობა უნდა ემთხვეოდეს და, ნებისმიერ შემთხვევაში, კვლავ მოქმედებს ორ კლავიშს შორის თავსებადობის პრინციპი.

    საგარეო გასაღები მაგალითი 2

    მაგიდის შექმნა სტუდენტი (
    Kod_stud მთელი რიცხვი NOT NULL PRIMARY ᲒᲐᲡᲐᲦᲔᲑᲘ,
    ცნობილი სიმბოლო (30) NOT NULL UNIQUE,
    მისამართები char(50),
    ბურთი ათობითი),
    Kod_spec მთელი რიცხვი REFERENCES Spec
    );

    რეფერენტული მთლიანობის შესანარჩუნებლად საჭიროა გარკვეული შეზღუდვები იმ მნიშვნელობებზე, რომლებიც შეიძლება იყოს წარმოდგენილი ველებში, რომლებიც გამოცხადებულია როგორც უცხო გასაღები და მშობელი გასაღები. მთავარი გასაღები უნდა იყოს სტრუქტურირებული ისე, რომ თითოეული უცხო გასაღების მნიშვნელობა შეესაბამება ერთ მითითებულ მწკრივს. ეს ნიშნავს, რომ ის (გასაღები) უნდა იყოს უნიკალური და არ შეიცავდეს ცარიელ მნიშვნელობებს (NULL).

    ეს არ არის საკმარისი იმისთვის, რომ ძირითადი გასაღები დააკმაყოფილოს იგივე მოთხოვნა, როგორც უცხო გასაღების გამოცხადებისას. SQLდარწმუნებული უნდა იყოს, რომ ორმაგი მნიშვნელობები ან ნულოვანი მნიშვნელობები არ არის შეყვანილი მშობლის გასაღებში. ამიტომ, თქვენ უნდა დარწმუნდეთ, რომ ყველა ველს, რომელიც გამოიყენება როგორც მშობლის გასაღებები, აქვს ან PRIMARY შეზღუდვა ᲒᲐᲡᲐᲦᲔᲑᲘან UNIQUE შეზღუდვა, როგორიცაა NOT NULL შეზღუდვა.

    უცხო გასაღებების მხოლოდ პირველადი გასაღების მითითება კარგი სტრატეგიაა. როდესაც გამოიყენება უცხოური გასაღებები, ისინი უბრალოდ არ ასოცირდება მშობელ გასაღებებთან, რომლებსაც ისინი მიმართავენ; ისინი ასოცირდება ცხრილის კონკრეტულ მწკრივთან, სადაც მოიძებნება მშობელი გასაღები. თავად მთავარი გასაღები არ გვაწვდის ინფორმაციას, რომელიც უკვე არ არის უცხო გასაღებში.

    ვინაიდან პირველადი გასაღების დანიშნულებაა მწკრივის უნიკალურობის იდენტიფიცირება, ეს უფრო ლოგიკური და ნაკლებად ორაზროვანი არჩევანია უცხო გასაღებისთვის. ნებისმიერი უცხო გასაღებისთვის, რომელიც იყენებს უნიკალურ გასაღებს, როგორც მის მთავარ გასაღებს, თქვენ უნდა შექმნათ უცხო გასაღები, რომელიც იყენებს იმავე ცხრილის ძირითად გასაღებს იმავე ეფექტისთვის. უცხო გასაღები, რომელსაც სხვა დანიშნულება არ აქვს, გარდა რიგების დაკავშირებისა, არის პირველადი გასაღების მსგავსი, რომელიც გამოიყენება მხოლოდ რიგების იდენტიფიცირებისთვის და არის კარგი საშუალება მონაცემთა ბაზის სტრუქტურის მკაფიო და მარტივი შესანარჩუნებლად. უცხო გასაღები შეიძლება შეიცავდეს მხოლოდ მნიშვნელობებს, რომლებიც რეალურად არის მშობლის გასაღებში ან ცარიელი (NULL). ამ კლავიშში სხვა მნიშვნელობების შეყვანის ნებისმიერი მცდელობა უარყოფილი იქნება.

    უცხოური გასაღები მაგალითი 3

    შექმენით მაგიდასთან გადახდა (
    sh_payout მთელი რიცხვი,
    sh_eml მთელი რიცხვი,
    date_გადახდის თარიღი,
    sum_payout რეალური,
    ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ(sh_eml) ლიტერატურა k_sotr2 (eid)
    );

    ამ მაგალითში ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ sh_eml სვეტი ასოცირდება eid სვეტთან k_sotr2 ცხრილიდან.

    კლავიშები რელაციური მონაცემთა ბაზის ფუნდამენტური ელემენტებია, რადგან ისინი ამყარებენ კავშირს ცხრილების წყვილს შორის და უზრუნველყოფენ ცხრილის თითოეული ჩანაწერის უნიკალურ იდენტიფიკაციას. გასაღებები უფრო მნიშვნელოვანია, ვიდრე ურთიერთობების დამყარება; ისინი ასევე ეხმარებიან რეფერენციულ მთლიანობას და ისინი არიან ცხრილის დონის მთლიანობის ძირითადი კომპონენტი. ცხრილები ინახავს მონაცემთა უზარმაზარ ნაწილებს, რომლებიც, როგორც წესი, მოიცავს ათასობით ჩანაწერს, ყველა მათგანი დაუხარისხებელი და დეზორგანიზებულია. ამ მრავალჯერადი ჩანაწერებიდან კონკრეტული მონაცემების მოძიება შეიძლება ზოგჯერ რთული ან შეუძლებელი იყოს. აქ გამოჩნდება კლავიშები. აქ განვიხილავთ მონაცემთა ბაზის სქემის ორ ძალიან მნიშვნელოვან კლავიშს და მათ შორის განსხვავებას: პირველადი გასაღები და უცხოური გასაღები.

    რა არის პირველადი გასაღები?

    პირველადი გასაღები არის სპეციალური გასაღები, რომელიც ცალსახად განსაზღვრავს ცხრილის თითოეულ ჩანაწერს. რელაციურ მონაცემთა ბაზაში ძალზე მნიშვნელოვანია, რომ გქონდეთ უნიკალური იდენტიფიკატორი ცხრილის თითოეულ მწკრივში და პირველადი გასაღები არის უბრალოდ ის, რაც გჭირდებათ ცხრილში ტოპის ცალსახად იდენტიფიცირებისთვის. ტუპლი არის მნიშვნელობის ატრიბუტების კრებული რელაციურ მონაცემთა ბაზაში. პირველადი გასაღები შეიძლება ეხებოდეს სვეტს ან სვეტების ერთობლიობას რელაციური მონაცემთა ბაზის ცხრილში, რომელიც გამოიყენება ცხრილის ყველა ჩანაწერის იდენტიფიცირებისთვის. პირველადი გასაღები უნდა იყოს უნიკალური თითოეული ჩანაწერისთვის, რადგან ის მოქმედებს როგორც უნიკალური იდენტიფიკატორი და არ უნდა შეიცავდეს Null მნიშვნელობებს. ყველა მონაცემთა ბაზას უნდა ჰქონდეს ერთი და მხოლოდ ერთი ძირითადი გასაღები.

    რა არის უცხო გასაღები?

    უცხოური გასაღები ეხება ველს ან ველების კრებულს მონაცემთა ბაზის ჩანაწერში, რომელიც ცალსახად განსაზღვრავს სხვა მონაცემთა ბაზის ჩანაწერის საკვანძო ველს სხვა ცხრილში. მარტივი სიტყვებით, ის ადგენს ურთიერთობას მონაცემთა ბაზაში ორ სხვადასხვა ცხრილებში ჩანაწერებს შორის. ეს შეიძლება იყოს ცხრილის სვეტი, რომელიც მიუთითებს პირველადი გასაღების სვეტებზე, რაც ნიშნავს, რომ ცხრილში განსაზღვრული უცხოური გასაღები ეხება სხვა ცხრილის ძირითად გასაღებს. ბმულები კრიტიკულია რელაციურ მონაცემთა ბაზებში ჩანაწერებს შორის ურთიერთობების დასამყარებლად, რაც აუცილებელია მონაცემთა ბაზების დახარისხებისთვის. უცხოური გასაღებები მნიშვნელოვან როლს ასრულებენ რელაციური მონაცემთა ბაზების ნორმალიზებაში, განსაკუთრებით მაშინ, როდესაც ცხრილებს სჭირდებათ წვდომა სხვა ცხრილებზე.

    განსხვავება ძირითად და უცხო გასაღებს შორის

    ძირითადი გასაღებისა და უცხოური გასაღების საფუძვლები

    პირველადი გასაღები არის სპეციალური გასაღები რელაციური მონაცემთა ბაზაში, რომელიც მოქმედებს როგორც უნიკალური იდენტიფიკატორი თითოეული ჩანაწერისთვის, რაც იმას ნიშნავს, რომ იგი ცალსახად განსაზღვრავს ცხრილის თითოეულ სტრიქონს/ჩანაწერს და მისი მნიშვნელობა უნდა იყოს უნიკალური ცხრილის თითოეული მწკრივისთვის. მეორეს მხრივ, უცხოური გასაღები არის ველი ერთ ცხრილში, რომელიც აკავშირებს ორ ცხრილს ერთმანეთთან. ეს ეხება სვეტს ან სვეტების ჯგუფს, რომელიც ცალსახად განსაზღვრავს სხვა ცხრილის ან იმავე ცხრილის მწკრივს.

    პირველადი გასაღებისა და საგარეო გასაღების ურთიერთობა

    პირველადი გასაღები ცალსახად განსაზღვრავს ჩანაწერს რელაციური მონაცემთა ბაზის ცხრილში, ხოლო უცხო გასაღები ეხება ცხრილის ველს, რომელიც არის სხვა ცხრილის ძირითადი გასაღები. პირველადი გასაღები უნდა იყოს უნიკალური და დაშვებულია მხოლოდ ერთი ძირითადი გასაღების განსაზღვრა ცხრილში, ხოლო ერთზე მეტი უცხო გასაღები ნებადართულია ცხრილში.

    პირველადი გასაღებისა და უცხოური გასაღების მნიშვნელობების დუბლიკატი

    პირველადი გასაღები არის UNIQUE და Not Null შეზღუდვების კომბინაცია, ამიტომ პირველადი გასაღების ველს რელაციური მონაცემთა ბაზის ცხრილში არ შეიძლება ჰქონდეს დუბლიკატი მნიშვნელობები. არცერთ ორ მწკრივს არ შეუძლია დუბლიკატი მნიშვნელობების შეტანა პირველადი გასაღების ატრიბუტისთვის. პირველადი გასაღებისგან განსხვავებით, უცხო გასაღები შეიძლება შეიცავდეს დუბლიკატ მნიშვნელობებს, ხოლო ცხრილი რელაციურ მონაცემთა ბაზაში შეიძლება შეიცავდეს ერთზე მეტ უცხო კლავიშს.

    NULL ძირითადი გასაღები და უცხო გასაღები

    ამ ორს შორის ერთ-ერთი მთავარი განსხვავება ისაა, რომ ძირითადი გასაღებებისგან განსხვავებით, უცხო კლავიშები ასევე შეიძლება შეიცავდეს NULL მნიშვნელობებს. რელაციური მონაცემთა ბაზის ცხრილს შეიძლება ჰქონდეს მხოლოდ ერთი ძირითადი გასაღები, რომელიც არ არის ნულოვანი.

    პირველადი გასაღებისა და უცხოური გასაღების დროებითი ცხრილი

    ძირითადი გასაღების შეზღუდვა შეიძლება განისაზღვროს იმპლიციტურად დროებით ცხრილებზე და მათ ცვლადებზე, მაშინ როცა უცხო გასაღების შეზღუდვა არ შეიძლება გამოყენებულ იქნას ადგილობრივ ან გლობალურ დროებით ცხრილებზე.

    პირველადი და უცხო გასაღების ამოღება

    ძირითადი გასაღების მნიშვნელობის წაშლა შეუძლებელია მშობლის ცხრილიდან, რომელიც მოხსენიებულია, როგორც უცხო გასაღები შვილობილი ცხრილში. სანამ მშობლის ცხრილის ჩამოყრას შეძლებთ, ჯერ ბავშვის მაგიდა უნდა ჩამოაგდოთ. ამის საპირისპიროდ, უცხო გასაღების მნიშვნელობა შეიძლება წაიშალოს შვილობილ ცხრილიდან მაშინაც კი, თუ მნიშვნელობა ეკუთვნის მშობლის ცხრილის ძირითად გასაღებს.

    ძირითადი გასაღები ან უცხო გასაღები: შედარების ცხრილი

    ძირითადი კლავიშების შეჯამება

    კლავიშები გადამწყვეტ როლს თამაშობენ მონაცემთა ბაზის სქემის არსებობაში, რათა დაამყარონ ურთიერთობები ცხრილებსა და ცხრილის შიგნით. Keys ამყარებს ურთიერთობებს და ახორციელებს სხვადასხვა სახის მთლიანობას, განსაკუთრებით ცხრილის და ურთიერთობის დონის მთლიანობას. პირველ რიგში, მათ მიაჩნიათ, რომ ცხრილი შეიცავს უნიკალურ ჩანაწერებს და ველები, რომლებსაც იყენებთ ცხრილებს შორის ურთიერთობების დასამყარებლად, უნდა შეიცავდეს შესაბამის მნიშვნელობებს. პირველადი გასაღები და უცხო გასაღები არის ორი ყველაზე მნიშვნელოვანი და გავრცელებული ტიპის გასაღებები, რომლებიც გამოიყენება რელაციურ მონაცემთა ბაზაში. პირველადი გასაღები არის სპეციალური გასაღები, რომელიც გამოიყენება ცხრილში ჩანაწერების ცალსახად იდენტიფიცირებისთვის, ხოლო უცხო გასაღები გამოიყენება ორ ცხრილს შორის ურთიერთობის დასამყარებლად. ორივე სტრუქტურით იდენტურია, მაგრამ განსხვავებულ როლს ასრულებს რელაციური მონაცემთა ბაზის სქემაში.

    დათვალიერება