Prevenzione degli errori del database

1

Sto progettando una struttura di database e mi piacerebbe che la sua progettazione potesse prevenire connessioni errate.

Farò un semplice esempio, che penso sia facile da capire, sotto sono le tabelle:

   Brand - Vehicle - Engine - Fuel Emision for Diesel test
                            - Fuel Emision for Gasoline test
                            - Fuel Emision for Trucks test
                            - Speed test

Supponiamo che uno Veicolo abbia un Marchio e un Motore , ma ci sono diversi tipi di test che puoi eseguire per < em> veicolo .

Come posso garantire ad esempio che i risultati del test " Emissione di carburante per autocarri " sono riportati su un ID di un veicolo Veicolo

Esiste un design in grado di nascondere alcune tabelle a un tipo di macchina o renderle non collegabili? O qualche tipo di assegno?

    
posta miguelmpn 04.03.2016 - 19:35
fonte

2 risposte

2

In Oracle è possibile creare una colonna virtuale basata su una funzione. La tua funzione può contenere qualsiasi logica di business che desideri, ma dovrebbe essere deterministica e aiuta se la funzione si risolve a 0 o 1 per chiarezza.

Crea una funzione utente che restituisce 1 se VEHICLE_TEST_TYPE_ID è valido per quel tipo di veicolo e quel tipo di test elencati per VEHICLE_TEST_TYPE.

Quindi crea una colonna virtuale su Your_Function (Vehicle_id, Vehicle_Test_Type_id) e un vincolo che la colonna = 1

    
risposta data 04.03.2016 - 21:47
fonte
2

La tua domanda sembra essere: Posso consentire o disabilitare le chiavi esterne in base a un valore in una riga del database?

La risposta breve a questa domanda è: no.

Quello che vuoi può essere raggiunto in diversi modi (in nessun ordine particolare):

  1. È possibile aggiungere trigger e / o stored procedure al database (a condizione che siano supportati dal motore di database preferito). Ogni volta che una nuova riga viene inserita in una delle tabelle di test, fallisce se il tipo di veicolo non corrisponde al test.
  2. Introdurre un nuovo set di tabelle per ogni tipo di veicolo che si desidera introdurre e fare in modo che le tabelle di prova siano collegate a queste. Ciò renderà la struttura del tuo database più complessa, soprattutto se desideri che un particolare tipo di test venga eseguito su più tipi di veicolo.
  3. Puoi programmarlo nella logica di business della tua applicazione.

Nota: l'utilizzo di qualsiasi funzione speciale (come stored procedure o colonne virtuali) dal motore di database scelto ha probabilmente una sintassi diversa, funziona in modo diverso e / o non è disponibile in un altro motore di database. L'utilizzo di una di queste soluzioni bloccherà efficacemente la tua applicazione su quel motore di database. Questo potrebbe non essere un problema, ma dovrebbe essere considerato parte del tuo progetto generale.

    
risposta data 04.03.2016 - 19:58
fonte

Leggi altre domande sui tag