Cos'è l'arco esclusivo nel database e perché è malvagio?


10

Stavo leggendo gli errori di progettazione del database più comuni commessi dallo sviluppatore Domande e risposte su StackOverflow. Alla prima risposta c'era una frase sull'arco esclusivo:

Un arco esclusivo è un errore comune in cui viene creata una tabella con due o più chiavi esterne in cui una e solo una di esse può essere non nulla. Grosso errore. Per prima cosa diventa molto più difficile mantenere l'integrità dei dati. Dopotutto, anche con integrità referenziale, nulla impedisce di impostare due o più di queste chiavi esterne (nonostante vincoli di controllo complessi).

Davvero non capisco perché l'arco esclusivo sia malvagio. Probabilmente non ho capito le basi. C'è qualche buona spiegazione sugli archi esclusivi?

Risposte:


8

Per quanto ho capito molto tempo fa, in un arco esclusivo una tabella contiene un numero di colonne che sono chiavi esterne di altre tabelle, ma solo una di queste può essere impostata alla volta (a causa di un vincolo logico sul dominio seguendo dal mondo reale). Poiché questa regola non può essere applicata sul database, è possibile creare un record corrotto in cui più di una di queste chiavi esterne ha un valore.

Farò un esempio. Prendi in considerazione un'applicazione in cui un'azienda tiene traccia dei camion che utilizza per consegnare le merci. Un camion può trovarsi solo in uno dei tre posti contemporaneamente: può essere con un dipendente, può essere in un garage o può essere in un negozio di manutenzione. Questo potrebbe essere modellato disponendo di una tabella Truck con EmployId, parkingGarageId e maintenanceShopId, facendo riferimento alle tabelle Employee, ParkingGarage e MaintenanceShop. Non è possibile applicare la regola secondo cui solo uno di questi campi viene compilato a livello di database. Codice errato o qualcuno con accesso diretto al database potrebbe inserire un record che ha due o tre campi riempiti, il che equivale alla corruzione dei dati nel database.


4
Le tre possibili posizioni dei camion sono sottoclassi di una superclasse, "posizione del camion". Esistono molti casi in cui le sottoclassi si escludono a vicenda. La sfida diventa come modellare classi e sottoclassi nelle tabelle relazionali.
Walter Mitty,

Sono d'accordo che ci sono casi in cui l'uso di questo disegno è giustificato. Posso, tuttavia, anche concordare con il post originale che questo modello è usato MOLTO più di quanto dovrebbe. Ha anche alcuni svantaggi molto grandi ...
JDT

6
Non è possibile utilizzare un vincolo di controllo? Per esempio 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. Naturalmente deve essere presente anche il vincolo FK.
Tulains Córdova,

1
Da qui i "vincoli di controllo complessi nonostante" dal post sopra citato. Potresti essere in grado di eseguire una convalida davvero sofisticata con vincoli di controllo o diamine, anche inneschi, che non lo rende una buona idea o un token di buon design. Immagina di fare vincoli di controllo su archi esclusivi con quattro o cinque colonne ... Inoltre, sono abbastanza sicuro che non tutti i motori di database supportano il vincolo CHECK . MySQL afferma esplicitamente nei documenti che le clausole CHECK sono analizzate, ma ignorate ...
JDT

Questa fonte raccomanda l'arco esclusivo. Pensieri?
Alex Moore-Niemi,

4

Non c'è nulla di male negli archi esclusivi. È sufficiente applicare la regola aziendale corrispondente utilizzando un vincolo di controllo. La maggior parte dei principali sistemi di gestione del database supporta vincoli di controllo (Oracle, SQL Server, PostgreSQL). Se si utilizza uno strumento di modellazione dei dati, è probabile che lo strumento generi automaticamente il codice per implementare il vincolo di controllo.


-1

L'arco esclusivo è molto utile nella progettazione concettuale o logica. Ciò non significa che devi implementare in quel modo. Nell'esempio precedente il progettista può decidere di implementare il progetto con tre tabelle. Uno per il parcheggio, uno per il dipendente e uno per l'officina di manutenzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.