Ceea ce se numește cheie primară într-o bază de date. Chei primare

Acestea sunt depozite electronice de informații care sunt accesate folosind unul sau mai multe computere. De obicei, bazele de date sunt create pentru a stoca și a accesa date care conțin informații despre unele domeniul subiectului, adică o zonă a activității umane sau o parte a lumii reale.

DBMS este software pentru a crea, completa, actualiza și șterge o bază de date.

Unitatea de informare stocată în baza de date este un tabel. Fiecare tabel este o colecție de rânduri și coloane, unde rândurile corespund unei instanțe a unui obiect, unui anumit eveniment sau fenomen, iar coloanele corespund atributelor (trăsături, caracteristici, parametri) obiectului, evenimentului sau fenomenului. Fiecare rând conține informații despre un anumit eveniment.

În termenii bazei de date, coloanele unui tabel sunt numite câmpuri, iar rândurile sale sunt numite înregistrări.

Între mese separate Pot exista relații în baza de date, adică informațiile din tabelul anterior pot fi adăugate la altul. Bazele de date care au relații între tabele individuale se numesc relaționale. Același tabel poate fi tabelul principal în raport cu un tabel al bazei de date și un tabel copil în raport cu altul.

Tabelele legate prin relații interacționează conform principiului master-slave. Același tabel poate fi tabelul principal al unui tabel de bază de date și un copil al altuia.

Un obiect este ceva care există și se distinge, posedă un set de proprietăți. Diferența dintre un obiect și un alt obiect este determinată de valorile proprietăților specifice.

Esență – reflectarea unui obiect în memoria unei persoane sau a unui computer.

Atribut – valoarea specifică a oricăreia dintre proprietățile entității.

Camp este un singur element al unei înregistrări care stochează o anumită valoare de atribut.

Domeniul de comunicare Acesta este câmpul prin care două tabele sunt legate.

Chei primare și secundare

Fiecare tabel de bază de date poate avea o cheie primară - acesta este un câmp sau o colecție de câmpuri care identifică în mod unic o înregistrare.

Valoarea cheii primare dintr-un tabel al bazei de date trebuie să fie unică, adică nu ar trebui să existe două sau mai multe înregistrări în tabel cu aceeași valoare a cheii primare.

Cheile primare facilitează stabilirea relațiilor între tabele. Deoarece cheia primară trebuie să fie unică, nu toate câmpurile din tabel pot fi folosite pentru aceasta.

Dacă tabelul nu are câmpuri ale căror valori sunt unice, pentru a crea o cheie primară, se introduce, de obicei, un câmp numeric suplimentar, de valorile cărora SGBD le poate dispune la discreția sa.

Cheile secundare sunt setate de câmpuri care sunt adesea folosite la căutarea sau sortarea datelor: indecșii construiți pe chei secundare vor ajuta sistemul să găsească mult mai rapid valorile necesare stocate în câmpurile corespunzătoare.

Spre deosebire de cheile primare, câmpurile pentru cheile secundare pot conține informații care nu sunt unice.

Relații relaționale între tabele

Unu la unu. O relație unu-la-unu apare atunci când o înregistrare dintr-un tabel părinte se potrivește cu o înregistrare dintr-un tabel copil.

Această relație este mult mai puțin comună decât relația unu-la-mulți, este folosită dacă nu doriți ca tabelul bazei de date să se umfle cu un tabel secundar. Comunicarea unu-la-unu are ca rezultat lizibilitatea informatii aferenteîn mai multe tabele, trebuie să efectuați mai multe operații de citire, ceea ce încetinește obținerea informațiilor necesare. În plus, bazele de date care conțin tabele cu o relație unu-la-unu nu pot fi considerate complet normalizate.

La fel ca o relație unu-la-mulți, o relație unu-la-unu poate fi fie grea, fie blândă.

Sunt utilizate în orice activitate: în industria bancară și financiară, afaceri turistice, depozite, producție și formare. Sunt o colecție de tabele, au proprietăți clare și sunt supuse unor cerințe stricte. În bazele de date relaționale, tabelele sunt numite relații.

Ce este o cheie primară într-o bază de date

Într-o bază de date, cheia primară a unui tabel este una dintre coloanele acestuia (cheia primară). Să ne uităm la un exemplu despre cum arată asta. Să ne imaginăm o simplă atitudine a studenților (să-i spunem „Studenți”).

Trebuie să identificăm în mod unic un student folosind o singură coloană. Pentru a face acest lucru, informațiile din această coloană trebuie să fie unice pentru fiecare intrare. Însă datele disponibile în acest sens nu ne permit să identificăm fără ambiguitate dosarul, întrucât toponimii, toponimii și studenții cu aceleași nume de familie și prenume pot studia în același curs și facultate. Cheia primară dintr-o bază de date este folosită pentru definiție precisă linia necesară în relație. Cel mai adesea, un câmp numeric este utilizat în această calitate, crescând automat pe măsură ce se introduce o înregistrare (coloana de identificare cu incrementare automată).

Cheie primară simplă și compusă

Cheia primară poate fi simplă sau compusă. Dacă unicitatea unei înregistrări este determinată de valoarea dintr-un singur câmp, așa cum este descris mai sus, avem de-a face cu cu o cheie simplă. O cheie compusă este o cheie primară a bazei de date constând din două sau mai multe câmpuri. Luați în considerare următoarea atitudine a clienților băncilor.

NUMELE COMPLET. Data nașterii Seria pașapoarte Pașaport ID
Ivanov P.A. 12.05.1996 75 0553009
Sergheev V.T. 14.07.1958 71 4100654
Krasnov L.V. 22.01.2001 73 1265165

Pașapoartele oamenilor pot conține aceleași serii sau numere, dar nu există pașapoarte cu aceeași serie și combinație de numere. Astfel, câmpurile „Seria pașaport” și „Număr pașaport” vor deveni o cheie compusă a relației specificate, identificând în mod unic persoana.

Legături între relații

Deci, o cheie primară într-o bază de date este una sau mai multe coloane ale unui tabel care permite identificarea unică a unui rând în acea relație. Pentru ce este?

Să revenim la primul exemplu cu relația „Elevi”. Pe lângă această relație, baza de date stochează și alte informații, de exemplu, performanța fiecărui elev. Pentru a nu repeta toate informațiile care sunt deja conținute în baza de date, folosesc cheia, referindu-se la intrarea dorită. Arata cam asa.

În cele două exemple de relații vedem un câmp ID. Acestea sunt cheile primare din baza de date pentru aceste tabele. După cum puteți vedea, dosarul academic conține doar link-uri către aceste câmpuri din alte tabele, fără a fi nevoie să indicați toate informațiile din acestea.

Cheie naturală și surogat

Cum se determină cheia primară a unui tabel al bazei de date? Cele două exemple pe care le-am analizat - „Studenți” și „Clienți bănci” - ilustrează conceptele de chei naturale și surogat. În tabelul clienților băncii, am definit o cheie formată din câmpurile „Număr” și „Seria pașaport”, folosind coloanele deja existente. Această cheie se numește naturală; nu am făcut nicio modificare sau adăugare pentru ao determina. În cazul relației „Studenți”, niciun câmp unic sau combinație de câmpuri nu ne-a oferit unicitate. Acest lucru ne-a forțat să introducem un câmp suplimentar de cod de student. Această cheie se numește o cheie surogat, pentru care am adăugat o altă coloană de serviciu la tabel. Această coloană nu poartă niciuna Informatii utileși servește doar la identificarea înregistrărilor.

Cheie străină și integritatea datelor în baza de date

Toate cele de mai sus ne duc la cheia externă și integritatea bazei de date. Cheia străină este un câmp care se referă la cheia primară a unei relații străine. În tabelul de progres, acestea sunt coloanele „Student” și „Disciplină”. Datele lor ne trimit la tabele externe. Adică câmpul „Student” din relația „Performanță” este o cheie străină, iar în relația „Student” este cheia primară din baza de date.

Un principiu important pentru construirea bazelor de date este integritatea acestora. Iar una dintre regulile sale este integritatea referenţială. Aceasta înseamnă că o cheie externă a unui tabel nu se poate referi la o cheie primară inexistentă a unei alte relații. Nu puteți șterge o înregistrare cu codul 1000 - Ivan Ivanov din relația Student dacă este referită printr-o înregistrare din tabelul de performanță academică. Într-o bază de date construită corespunzător, când încercați să ștergeți, veți primi o eroare că acest câmp este în uz.

Există și alte grupuri de reguli de integritate, precum și alte restricții de baze de date, care merită, de asemenea, atenție și ar trebui luate în considerare de dezvoltatori.

Mese

Într-o bază de date relațională, informațiile sunt organizate în tabele relaționale, împărțite în rânduri și coloane, la intersecția cărora sunt conținute valorile datelor.

Masa - aceasta este o structură regulată constând dintr-un set finit de înregistrări de același tip.

Tabelul reflectă tipul de obiect (entitate) din lumea reală. Rândurile corespund unei instanțe a unui obiect, unui anumit eveniment sau fenomen. Coloanele corespund atributelor (trăsături, caracteristici, parametri) ale unui obiect, eveniment, fenomen. Fiecare tabel are un nume unic în baza de date care descrie conținutul acestuia.

Fiecare coloană dintr-un tabel are un nume, care servește de obicei ca antet de coloană. Toate coloanele dintr-un tabel trebuie să aibă nume unice, totuși, este permisă atribuirea acelorași nume coloanelor situate în diverse mese. ÎN model relaționalÎn date, atributele relației nu sunt ordonate, adică câmpurile sunt întotdeauna accesate după nume, nu după locație. Cu toate acestea, în Limbajul SQL indexarea coloanelor din tabel este permisă, iar coloanele sunt considerate în ordine de la stânga la dreapta (ordinea lor este determinată la crearea tabelului).

Orice tabel are întotdeauna cel puțin o coloană. Standardul ANSI/ISO nu specifică un număr maxim de coloane pe tabel, dar aproape toate SGBD-urile comerciale au o limită. ÎN DBMS Firebird această limită este de 32.767 de coloane.

În modelul de date relaționale RMD, conceptul de tuplu este folosit pentru a desemna un rând al unei relații. Reprezentarea unui tuplu pe nivel fizic este un rând de tabel al bazei de date. Rândurile tabelului nu au nume și nicio ordine specifică. Tabelul poate conține orice număr de rânduri. Este perfect acceptabil să existe un tabel cu zero rânduri. Un astfel de tabel se numește gol. Un tabel gol păstrează structura definită de coloanele sale, pur și simplu nu conține date. De regulă, nu există restricții privind numărul de rânduri dintr-un tabel, iar în multe SGB-uri dimensiunea tabelelor este limitată doar de spatiu pe disc calculator. Alte SGBD-uri au o limită maximă, dar este destul de mare - aproximativ două miliarde de rânduri și uneori mai multe.

Să ilustrăm mai clar structura unuia dintre tabelele din baza de date de instruire (vezi Anexa A). În fig. 1.1 prezintă structura tabelului Abonent, care conține informații despre abonații companiilor de locuințe și servicii comunale.

Orez. 1.1. Structura tabelului relațional Abonent

Fiecare rând orizontal al acestui tabel reprezintă o entitate fizică separată - un abonat. Cele douăsprezece rânduri ale tabelului reprezintă împreună toți abonații. Toate datele conținute într-un anumit rând de tabel sunt un set de valori ale atributelor abonat specific, care este descris de această linie.


Fiecare coloană verticală a tabelului reprezintă o colecție de valori pentru un anumit atribut al unui obiect. De exemplu, coloana AccountCD conține numere unice de cont de abonat. Coloana Telefon conține numerele de telefon ale abonaților.

Intersecția fiecărui rând cu fiecare coloană a tabelului conține exact o valoare de date. De exemplu, într-un rând care reprezintă abonatul V.S Konyukhov, coloana Fio conține valoarea „V.S. Coloana AccountCD de pe același rând conține valoarea „015527”, care este numărul cont personal abonat cu nume complet Konyukhov V.S.

Toate valorile conținute în aceeași coloană sunt de același tip de date. De exemplu, coloana Fio conține numai cuvinte, în timp ce coloana StreetCD conține numere întregi care reprezintă ID-urile străzilor. Într-un model de date relaționale, setul total de valori din care valori reale pentru anumite atribute (coloane), numite domeniu. Domeniul coloanei Fio, de exemplu, este un set de nume de familie, prenume și patronimice (numele complet) ale abonaților. Fiecare coloană este întotdeauna definită pe un domeniu.

În bazele de date relaționale, un domeniu este determinat prin specificarea a cel puțin unora tip de bază datele cărora le aparțin elementele domeniului și adesea și o expresie booleană arbitrară aplicată elementelor acelui tip de date (constrângeri de domeniu).

În baza de date de instruire sunt definite următoarele domenii:

§ Boolean: SMALLINT. Câmpurile definite în acest domeniu pot accepta doar valori întregi egale cu 0 sau 1. Acest lucru se realizează prin impunerea unei condiții de verificare (CHECK) în domeniu asupra valorilor acceptate de acest domeniu.

§ Bani: NUMERIC(15,2). Domeniul este destinat definirii câmpurilor din tabele care stochează sume monetare.

§ PKField: INTEGER. Domeniul este folosit pentru a defini cheile primare și externe ale tabelelor. Nu există o cerință obligatorie de date (NU NULL) pentru acest domeniu. Este impus la declararea cheii primare a tabelului. Acest lucru se face astfel încât o cheie străină să poată fi definită pe acest domeniu fără condiția NOT NULL.

§ TLună (lună): SMALLINT. Domeniul este destinat definirii câmpurilor din tabele care conțin numerele lunii. Valorile întregi într-un astfel de câmp pot fi în intervalul 1...12.

§ TYear (An): SMALLINT. Domeniul este destinat să definească câmpuri care conțin numărul anului. Valorile întregi pot fi în intervalul 1990...2100.

Deoarece rândurile dintr-un tabel relațional nu sunt ordonate, nu puteți selecta un rând după numărul din tabel. Nu există „primul”, „ultimul” sau „al treisprezecelea” rând în tabel. Atunci, cum puteți indica un anumit rând în tabel, de exemplu, un rând pentru un abonat cu numele complet Aksenov S.A.?

Elementul cheie date este un element din care pot fi determinate valorile altor elemente de date.

Într-o bază de date relațională, fiecare tabel are 1 sau mai multe coloane ale căror valori sunt diferite în fiecare rând. Această coloană(e) se numește cheia primară a tabelului.

Cheia principala - este un atribut sau un grup de atribute care identifică în mod unic fiecare rând dintr-un tabel.

Să revenim la considerarea tabelului Abonent al bazei de date de antrenament (Fig. 1.1). La prima vedere, atât coloana AccountCD, cât și coloana Fio pot servi ca cheie primară a tabelului Abonent. Cu toate acestea, dacă sunt înregistrați 2 abonați cu același nume complet, coloana Fio nu va mai putea servi ca cheie primară. În practică, identificatori, cum ar fi numărul unic de cont personal al abonatului (AccountCD în tabelul Abonent), identificatorul străzii (StreetCD în tabelul Street), etc. ar trebui de obicei selectați ca chei primare ale tabelelor.

Dacă tabelul nu are câmpuri ale căror valori sunt unice, pentru a crea o cheie primară, de obicei este introdus un câmp suplimentar, de valorile cărora SGBD le poate dispune la discreția sa.

Dacă cheia primară este o combinație de coloane, atunci o astfel de cheie primară este apelată compozit.

Chei secundare sunt stabilite de câmpuri care sunt adesea folosite la căutarea sau sortarea datelor. Spre deosebire de cheile primare, câmpurile pentru cheile secundare pot conține valori care nu sunt unice.

Prezența relațiilor, a referințelor încrucișate între tabele este una dintre cele proprietăți fundamentale, distingând bază relațională date dintr-un set simplu de tabele. Pentru a implementa astfel de relații, aproape toate SGBD-urile vă permit să definiți primar și chei externeși includ mecanisme de menținere a integrității referențiale.

Cheia principala

Am atins deja pe scurt conceptul de cheie primară în articolul despre normalizarea bazei de date. O cheie primară este o coloană sau un grup de coloane care identifică în mod unic o înregistrare. O cheie primară este prin definiție unică: un tabel nu poate avea două rânduri diferite cu aceleași valori ale cheii primare. Coloanele care alcătuiesc cheia primară nu pot avea Valoare NULL. Fiecare tabel poate avea o singură cheie primară.

Cheie unică

O cheie unică este o coloană sau un grup de coloane ale căror valori (o combinație de valori pentru un grup de coloane) nu pot fi repetate. Diferențele dintre o cheie unică și o cheie primară sunt următoarele:

  • Pot exista mai multe chei unice pentru un tabel (o întrebare rapidă pentru cei care citesc articolul despre normalizare: care sunt regulile formă normală va fi încălcat? ;)
  • cheile unice pot avea valori NULL, iar dacă există mai multe rânduri cu valori unice ale cheilor NULL, astfel de rânduri sunt considerate distincte (unice) conform standardului SQL 92.

Cheie externă

Cheile externe sunt mecanismul principal de organizare a relațiilor dintre tabele și de menținere a integrității și consecvenței informațiilor din baza de date.

O cheie externă este o coloană sau un grup de coloane care face referire la o coloană sau un grup de coloane dintr-un alt (sau același) tabel. Tabelul la care face referire cheia străină se numește tabel părinte, iar coloanele la care face referire cheia străină se numesc cheie părinte. Cheia părinte trebuie să fie o cheie primară sau unică, dar valorile cheii străine pot fi repetate de orice număr de ori. Adică, relațiile unu-la-mai multe sunt acceptate folosind chei străine. Tipurile de date (și în unele SGBD-uri, dimensiuni) coloanelor corespunzătoare cheie străină și cheie părinte trebuie să se potrivească.

Și cel mai important lucru. Toate valorile cheii străine trebuie să se potrivească cu una dintre valorile cheii părinte. (Notă între paranteze despre potrivire/nepotrivire: nuanțe apar atunci când se găsește NULL în valorile coloanelor chei secundare. Să nu intrăm în aceste nuanțe deocamdată). Nu sunt permise valorile chei străine care nu au valorile chei părinte corespunzătoare. Aici trecem fără probleme la conceptul de integritate referenţială.

Integritate referenţială

Prima dintre regulile de integritate referenţială este de fapt deja enunţată în paragraful anterior: nu li se permite să apară rânduri în tabel (indiferent când se adaugă sau se modifică) a cărei cheie externă nu se potrivește cu niciuna dintre valorile existente ale cheii părinte.

Mai mult puncte interesante apar atunci când ștergem sau modificăm rânduri din tabelul părinte. Cum să preveniți apariția rândurilor „atârnând în aer” ale mesei pentru copii? În acest scop, există reguli de integritate referenţială ON UPDATE şi ON DELETE care, conform standardului SQL 92, pot conţine următoarele instrucţiuni:

  • CASCADE - asigură că aceleași modificări care au fost făcute în cheia părinte sunt efectuate automat în tabelul copil. Dacă cheia părinte a fost schimbată - ON UPDATE CASCADE se va asigura că aceleași modificări ale cheii străine sunt făcute în tabelul copil. Dacă un rând din tabelul părinte a fost șters, ON DELETE CASCADE se va asigura că toate rândurile corespunzătoare din tabelul copil sunt șterse.
  • SET NULL - Când ștergeți un rând din tabelul părinte, ON DELETE SET NULL va seta toate coloanele cheii secundare din rândurile corespunzătoare din tabelul copil la NULL. Când schimbați cheia părinte, ON UPDATE SET NULL va seta valoarea la NULL în coloanele corespunzătoare rândurile corespunzătoare (oh cum:) ale tabelului copil.
  • SET DEFAULT - funcționează similar cu SET NULL, doar că scrie valorile implicite în celulele corespunzătoare, mai degrabă decât NULL.
  • FĂRĂ ACȚIUNE (setat implicit) - atunci când cheia părinte se schimbă, nu se întreprinde nicio acțiune asupra cheii externe din tabelul copil. Dar dacă modificarea valorilor cheii părinte duce la o încălcare a integrității referențiale (adică la apariția unor rânduri ale tabelului copil „atârnate în aer”), atunci DBMS nu va permite efectuarea unor astfel de modificări la masa părinte.

Ei bine, acum - de la general la specific.

Chei și integritate referențială în MySQL și Oracle

Oracle acceptă integral chei străine primare, unice. Oracle acceptă următoarele reguli de integritate referenţială:

  • FĂRĂ ACȚIUNE (setat implicit) într-o versiune mai strictă decât standardul SQL 92: modificarea și ștergerea rândurilor din tabelul părinte pentru care există șiruri aferenteîn mesele pentru copii.
  • ON DELETE CASCADE.

Mai mult reguli complexe Integritatea referenţială în Oracle poate fi implementată prin mecanismul de declanşare.

MySQL versiunea 4.1 (cea mai recentă la momentul scrierii versiune stabilă) vă permite să specificați REFEREnțe / fraze CHEIE STRĂINE în comenzile CREATE / ALTER TABLE, dar nu le ia în considerare în niciun fel și nu creează efectiv chei străine. În consecință, regulile de integritate referențială implementate prin chei străine nu sunt acceptate în MySQL. Și toate preocupările pentru a asigura integritatea și coerența informațiilor în Baza de date MySQL cad pe umerii dezvoltatorilor de aplicații client.

Dezvoltatorii MySQL promit să implementeze lucrul cu chei străine și să mențină integritatea referențială în versiunea 5.0. Ei bine, când versiunea MySQL 5.0 devine stabilă, vom vedea ce se întâmplă acolo până la urmă. Mi-ar plăcea foarte mult ca MySQL să susțină integritatea referențială (fără a sacrifica performanța :).