Stavo leggendo i più comuni errori di progettazione del database commessi dallo sviluppatore Q & A su stackoverflow. Alla prima risposta cera una frase sullarco esclusivo:
Un arco esclusivo è un errore comune in cui una tabella viene creata con due o più chiavi esterne dove una e solo uno di essi può essere non nullo. Grosso errore. Per prima cosa diventa molto più difficile mantenere lintegrità dei dati. Dopotutto, anche con integrità referenziale, nulla impedisce di impostare due o più di queste chiavi esterne (nonostante i vincoli di controllo complessi).
Davvero non “Non capisco perché larco esclusivo sia malvagio. Probabilmente non ne capivo le basi.” Cè qualche buona spiegazione sugli archi esclusivi?
Risposta
Per quanto lho capito molto tempo fa, in un esclusivo arc una tabella contiene un numero di colonne che sono chiavi esterne ad altre tabelle, ma solo una di queste può essere impostata alla volta (a causa di qualche vincolo logico sul dominio derivante dal mondo reale). Poiché questa regola non può essere applicata al database, è possibile creare un record danneggiato in cui più di una di queste chiavi esterne ha un valore.
Farò un esempio. Considera unapplicazione di cui unazienda tiene traccia i camion che utilizza per consegnare le merci. Un camion può trovarsi solo in uno dei tre luoghi contemporaneamente: può essere con un dipendente, può essere in un parcheggio o può essere in unofficina. Questo potrebbe essere modellato avendo una tabella Truck con EmployeeId, parkingGarageId e maintenanceShopId, che fa riferimento alle tabelle Employee, ParkingGarage e MaintenanceShop. Non cè modo di applicare la regola che solo uno di questi campi è compilato a livello del database. Codice non valido o qualcuno con accesso diretto al database potrebbe inserire un record che ha due o tre campi riempiti, il che equivale a un danneggiamento dei dati nel database.
Commenti
Risposta
Non cè niente di male negli archi esclusivi. È sufficiente applicare la regola aziendale corrispondente utilizzando un vincolo di controllo. La maggior parte dei principali sistemi di gestione di database supporta i vincoli di controllo (Oracle, SQL Server, PostgreSQL). Se stai utilizzando uno strumento di modellazione dei dati, ci sono buone probabilità che il tuo strumento generi automaticamente il codice per implementare il vincolo di controllo.
Risposta
Larco esclusivo è molto utile nella progettazione concettuale o logica. Non significa che devi implementare in questo modo. Nellesempio precedente il progettista può decidere di implementare il progetto con tre tabelle. Uno per il parcheggio location, uno per il dipendente e uno per lofficina.
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))
. Non ' mi piacciono gli archi esclusivi, ma possono essere applicati con un vincolo di controllo. Ovviamente deve essere presente anche il vincolo FK.