Sunteți pe pagina 1din 4

SQL SERVER – Diferența dintre cheile candidate și cheia primară

Introducere
Nu cu mult timp în urmă, am avut o dezbatere interesantă și extinsă cu unul dintre prietenii
mei cu privire la ce coloană ar trebui să fie cheia principală într-un tabel. Dezbaterea a
instigat o discuție aprofundată despre cheile candidate și cheile primare. Articolul meu de
față se învârte în jurul celor două tipuri de chei.

Să încercăm mai întâi să înțelegem definiția celor două chei.

Cheie de candidat – O cheie de candidat poate fi orice coloană sau o combinație de


coloane care se poate califica ca cheie unică în baza de date. Pot exista mai multe chei de
candidat într-un singur tabel. Fiecare cheie de candidat se poate califica ca cheie primară.

Cheie primară – O cheie primară este o coloană sau o combinație de coloane care
identifică în mod unic o înregistrare. O singură cheie candidat poate fi cheie primară.

Trebuie să fiți foarte atenți în selectarea cheii primare, deoarece o selecție incorectă poate
afecta negativ arhitectul bazei de date și normalizarea viitoare. Pentru ca o cheie candidată
să se califice ca cheie primară, aceasta ar trebui să fie Non-NULL și unică în orice
domeniu. Am observat destul de des că cheile primare sunt rareori schimbate. Aș dori să
am feedback-ul dvs. cu privire la neschimbarea unei chei primare.

Un exemplu pentru a înțelege cheile


Să ne uităm la un exemplu în care avem mai multe chei de candidat, din care vom selecta o
cheie primară adecvată.

Mai jos este un exemplu de tabel cu trei coloane care se pot califica ca cheie de candidat
cu o singură coloană, iar la combinarea mai multor coloane, numărul de chei de candidat
posibil atinge șapte. Un punct de reținut aici este că doar o coloană poate fi selectată ca
cheie primară. Decizia de selecție a cheii primare din combinațiile posibile de cheie
candidat este adesea foarte nedumerită, dar foarte imperativă!
La rularea următorului script, va oferi întotdeauna 504 rânduri în toate opțiunile. Acest lucru
demonstrează că toate sunt unice în baza de date și îndeplinesc criteriile unei chei primare.

Rulați următorul script pentru a verifica dacă toate tabelele au valori unice sau nu.

USE AdventureWorks
GO
SELECT *
FROM Production.Product
GO
SELECT DISTINCT ProductID
FROM Production.Product
GO
SELECT DISTINCT Name
FROM Production.Product
GO
SELECT DISTINCT ProductNumber
FROM Production.Product
GO

Toate interogările de mai sus vor returna același număr de înregistrări; prin urmare, toate se
califică drept chei de candidat. Cu alte cuvinte, ei sunt candidații pentru Cheia
Primară. Există câteva puncte de luat în considerare atunci când transformați orice cheie de
candidat într-o cheie primară.

Selectați o cheie care nu conține NULL


Este posibil să existe chei candidate care în prezent nu conțin valoare (nu nulă), dar din
punct de vedere tehnic pot conține nul. În acest caz, ei nu se vor califica pentru cheia
principală. În următoarea structură a tabelului, putem vedea că, deși coloana [name]nu are
nicio valoare NULL, nu se califică, deoarece are potențialul de a conține valoare NULL în
viitor.

CREATE TABLE [Production].[Product](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[Name] [dbo].[Name] NULL,
[ProductNumber] [nvarchar](25) NOT NULL,
[Manufacturer] [nvarchar](25) NOT NULL
)

Selectați o cheie care este unică și nu se repetă


Este posibil ca cheile candidatului care sunt unice în acest moment să conțină o valoare
duplicată. Aceste tipuri de chei candidate nu se califică pentru cheia principală. Să
înțelegem acest scenariu analizând exemplul dat mai sus. Este absolut posibil ca doi
Producători să poată crea produse cu același nume; numele rezultat va fi un duplicat și
numai numele Producătorului va diferi în tabel. Acest lucru descalifică numele din tabel
pentru a fi o cheie primară.

Asigurați-vă că cheia primară nu se schimbă în


continuare
Aceasta nu este o regulă strictă și rapidă, ci mai degrabă o recomandare generală: valorile
cheii primare nu ar trebui să se schimbe în continuare. Este destul de convenabil pentru o
bază de date dacă cheia primară este statică. Cheile primare sunt menționate în
numeroase locuri din baza de date, de la index la chei străine. Dacă continuă să se
schimbe, atunci pot afecta negativ integritatea bazei de date, statisticile datelor, precum și
interioarele indexurilor.

Selectarea cheii primare


Să examinăm cazul nostru aplicând cele trei reguli de mai sus la tabel și să decidem cu
privire la candidatul potrivit pentru cheia principală. Numele poate conține NULL, așa că
este descalificat conform Regula 1 și Regula 2. Numărul de produs poate fi duplicat pentru
diferiți producători, așa că este descalificat conform Regula 2. ProductID este Identitate și
coloana Identitate nu poate fi modificată. Deci, în acest caz ProductID se califică drept
cheie primară.

Vă rugăm să rețineți că mulți experți în baze de date sugerează că nu este o practică bună
să faceți coloana de identitate ca cheie primară. Motivul din spatele acestei sugestii este că
de multe ori coloana de identitate care a fost atribuită ca cheie primară nu joacă niciun rol în
baza de date. Nu există nicio utilizare a acestei chei primare atât în aplicație, cât și în T-
SQL. În plus, această cheie primară nu poate fi utilizată în Joinuri. Este un fapt cunoscut că
atunci când există JOIN pe cheia primară sau când cheia primară este utilizată în condiția
WHERE, de obicei oferă performanțe mai bune decât coloanele fără cheie primară. Acest
argument este absolut valid și trebuie să vă asigurați că nu folosiți o astfel de coloană de
identitate. Cu toate acestea, exemplul nostru prezintă un caz diferit. Aici, deși ProductID
este Identity Column, definește în mod unic rândul și aceeași coloană va fi folosită ca cheie
externă în alte tabele.

Notă rapidă despre alte tipuri de chei


Paragraful de mai sus evocă o altă întrebare – ce este o cheie străină? O cheie externă
dintr-un tabel de bază de date este o cheie dintr-un alt tabel care se referă la cheia primară
din tabelul utilizat. O cheie primară poate fi referită prin mai multe chei străine din alte
tabele. Nu este necesar ca o cheie primară să fie referința vreunei chei străine. Partea
interesantă este că o cheie străină se poate referi înapoi la același tabel, dar la o coloană
diferită. Acest tip de cheie străină este cunoscut sub denumirea de „cheie străină de auto-
referință”.

rezumat
Un tabel poate avea mai multe chei candidate care sunt unice ca o singură coloană sau
combinate mai multe coloane la tabel. Toți sunt candidați pentru cheia principală. Cheile
candidate care respectă toate cele trei reguli – 1) Nu sunt nule, 2) Valoare unică în tabel și
3) Statice – sunt cele mai bune candidate pentru Cheia primară. Dacă există mai multe chei
candidate care îndeplinesc criteriile pentru Cheia primară, decizia ar trebui luată de DBA cu
experiență, care ar trebui să țină cont de performanță.

S-ar putea să vă placă și