CNP-ul poate să fie foreign key (dacă utilizezi chei naturale, care pot fi compuse din una sau mai multe coloane introduse de utilizator) sau poate să nu fie foreign key (dacă utilizezi chei surogat, care sunt constituite dintr-o singură coloană, generată de baza de date):
CREATE TABLE Salariati (
CNPSalariat char(13) PRIMARY KEY,
NumeSalariat varchar(50) NOT NULL,
PrenumeSalariat varchar(50) NOT NULL
)
CREATE TABLE PersoaneIntretinute (
CNPPersoana char(13) PRIMARY KEY,
CNPSalariat char(13) FOREIGN KEY REFERENCES Salariati (CNPSalariat),
NumePersoana varchar(50) NOT NULL,
PrenumePersoana varchar(50) NOT NULL,
Relatie char(1) NOT NULL CHECK (Relatie IN ('C','S','P')) -- copil/sotie/parinte
)
sau
CREATE TABLE Salariati (
ID_Salariat int IDENTITY PRIMARY KEY,
NumeSalariat varchar(50) NOT NULL,
PrenumeSalariat varchar(50) NOT NULL,
CNPSalariat char(13) NOT NULL UNIQUE
)
CREATE TABLE PersoaneIntretinute (
ID_Persoana int IDENTITY PRIMARY KEY,
ID_Salariat int NOT NULL FOREIGN KEY REFERENCES Salariati (ID_Salariat),
NumePersoana varchar(50) NOT NULL,
PrenumePersoana varchar(50) NOT NULL,
Relatie char(1) NOT NULL CHECK (Relatie IN ('C','S','P')), -- copil/sotie/parinte
CNPPersoana char(13) NOT NULL UNIQUE
)
Ambele design-uri sunt posibile, iar dezbaterea despre care e mai bun este nesfârşită. Personal, optez pentru chei surogat, nu doar din raţiuni de performanţă (un int e mai mic şi mai rapid pt JOIN-uri decât un char(13)), cât mai ales de design al interfeţei (e mai uşor să fac un combo bazat pe o coloană int, decât pe una sau mai multe coloane de diverse tipuri). Un lucru important însă, atunci când folosim chei surogat, este să ne asigurăm că am definit şi o cheie unică formată din coloane introduse de utilizator.
Răzvan