Che cosè larco esclusivo nel database e perché ' è malvagio?

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

  • Le tre possibili posizioni dei camion sono sottoclassi di una superclasse, " posizione del camion ". Ci sono molti casi in cui le sottoclassi si escludono a vicenda. La sfida diventa come modellare classi e sottoclassi nelle tabelle relazionali.
  • Sono daccordo che ci sono casi in cui luso di questo design è giustificato. Posso, tuttavia, anche essere daccordo con il post originale sul fatto che questo pattern è usato MOLTO più di quanto dovrebbe. Ha anche degli svantaggi molto grandi …
  • Non è possibile utilizzare un vincolo di controllo? Ad 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. Ovviamente deve essere presente anche il vincolo FK.
  • Quindi i " vincoli di controllo complessi nonostante " dal post citato sopra. Potresti essere in grado di eseguire una convalida davvero sofisticata con vincoli di controllo o diamine, persino trigger, che ' non la rendono una buona idea o un segno di buon design. Immagina di fare i vincoli di controllo su archi esclusivi con quattro o cinque colonne … Inoltre, ' sono abbastanza sicuro che non tutti i motori di database supportare il vincolo CHECK . MySQL afferma esplicitamente nei documenti che le clausole CHECK vengono analizzate, ma ignorate …
  • Questa fonte consiglia larco esclusivo. Pensieri?

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *