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.
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.
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ă.
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
)
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.
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ță.