Citeam cele mai frecvente greșeli de proiectare a bazelor de date făcute de dezvoltator Q & A pe stackoverflow. La primul răspuns a existat o frază despre arc exclusiv:
Un arc exclusiv este o greșeală obișnuită în care un tabel este creat cu două sau mai multe chei străine unde una și numai unul dintre ele poate fi nul. Mare greșeală. În primul rând, devine mult mai greu să păstrezi integritatea datelor. La urma urmei, chiar și cu integritate referențială, nimic nu împiedică setarea a două sau mai multe dintre aceste chei străine (cu toate acestea, constrângeri complexe de verificare).
„Nu înțeleg de ce arcul exclusiv este rău. Probabil că nu am înțeles elementele de bază ale acestuia. Există vreo explicație bună asupra arcurilor exclusive?
Răspuns
În măsura în care am înțeles-o cu mult timp în urmă, într-un arc un tabel conține un număr de coloane care sunt chei străine pentru alte tabele, dar numai una dintre acestea poate fi setată la un moment dat (din cauza unor constrângeri logice asupra domeniului care urmează din lumea reală). Deoarece această regulă nu poate fi aplicată în baza de date, ar putea fi creată o înregistrare coruptă în care mai mult de una dintre aceste chei străine are o valoare.
Voi face un exemplu. Luați în considerare o aplicație în care o companie ține evidența camioanele pe care le folosește pentru livrarea mărfurilor. Un camion poate fi doar în unul din cele trei locuri în același timp: poate fi cu un angajat, poate fi într-un garaj de parcare sau poate fi într-un atelier de întreținere. Acest lucru ar putea fi modelat deținând un Truck-table cu employeeId, parkingGarageId și maintenanceShopId, referindu-se la Employee, ParkingGarage și MaintenanceShop-tabele. Nu există nicio modalitate de a aplica regula conform căreia doar unul dintre aceste câmpuri este completat la nivelul bazei de date. Cod greșit sau cineva cu acces direct la baza de date ar putea insera o înregistrare care are două sau trei câmpuri completate, ceea ce înseamnă corupția datelor în baza de date.
Comentarii
Răspuns
Nu există nimic rău în privința arcurilor exclusive. Pur și simplu aplicați regula de afaceri corespunzătoare utilizând o constrângere de verificare. Majoritatea sistemelor majore de gestionare a bazelor de date acceptă constrângerile de verificare (Oracle, SQL Server, PostgreSQL). Dacă utilizați un instrument de modelare a datelor, atunci există șanse mari ca instrumentul dvs. să genereze automat codul pentru a implementa constrângerea de verificare.
Răspuns
Arcul exclusiv este foarte util în proiectarea conceptuală sau logică. Nu înseamnă că trebuie să implementați acest lucru. În exemplul anterior, proiectantul poate decide să implementeze proiectarea cu trei tabele. Una pentru parcare locație, una pentru angajat și una pentru atelierul de întreținere.
alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))
. Nu ' îmi plac arcurile exclusive, dar pot fi aplicate cu o constrângere de verificare. Desigur, constrângerea FK trebuie să fie de asemenea prezentă.