Il mio RDBMS multi-server o la mia applicazione gestiscono l'integrità referenziale del database?

16

Gli elementi come chiavi esterne, vincoli, valori predefiniti e così via devono essere gestiti dal sistema di gestione del database (in questo caso, MS SQL 2005) o dall'applicazione? Ho ascoltato le opinioni di entrambe le parti e onestamente non sono sicuro di quale direzione andare.

C'è una possibilità che copriremo più server / database e non credo che le chiavi esterne possano essere utilizzate su server collegati. In aggiunta a ciò, ci sono alcuni riferimenti circolari nel design del database che mi impediscono di usare ON UPDATE CASCADE su tutto.

Il database è MS SQL 2005 (probabilmente 2008) e tutte le interazioni con esso dovrebbero passare attraverso l'applicazione.

    
posta Rachel 08.10.2010 - 21:36
fonte

5 risposte

10

Se c'è qualche possibilità che il DB venga modificato al di fuori dell'applicazione, si vogliono i vincoli nel database. Se il DB è e sarà sempre nient'altro che il back-end dell'applicazione, puoi lasciarli fuori, anche se li avrei documentati per ogni evenienza e probabilmente li terrei dentro solo se il risultato della performance non fosse poi così male. (Il software Peoplesoft funziona in questo modo: i vincoli sono nel software e (non lo sto facendo) esegue tutto come SYS su Oracle.)

Vuoi che le cose vengano monitorate dall'applicazione, in modo che possa reagire in modo intelligente e non nel migliore dei casi rispedisca un messaggio di errore del database all'utente.

E, sì, questa è una doppia copertura, ma senza di essa probabilmente otterrai corruzione dei dati prevenibile o un'interfaccia utente sbagliata.

    
risposta data 08.10.2010 - 21:46
fonte
5

Idealmente, entrambi. Non dovresti non avere il DB a gestirlo, ma poi di nuovo, se l'app genera dati che il DB rifiuterà, si tratta di un errore di runtime, quindi l'app dovrebbe avere almeno un codice dedicato preservare l'integrità referenziale. Inoltre, impostare i vincoli giusti in SQL nel DB è molto più semplice che configurare il codice per il lato client, quindi farlo sul DB riduce notevolmente la quantità di lavoro che è necessario eseguire.

    
risposta data 08.10.2010 - 21:54
fonte
1

Se è importante, lascia che sia il database a gestirlo. In questo modo, non devi preoccuparti di qualcuno che accede al database all'esterno dell'applicazione e modifica o inserisce dati incoerenti o duplicati. A meno che non si tratti di alcune applicazioni specifiche di alto livello (come "solo gli utenti del dipartimento X che hanno una classe di accesso ZZZ dovrebbero appartenere al gruppo 999"), ma di solito non si parla di integrità "referenziale".

    
risposta data 08.10.2010 - 21:48
fonte
1

Direi di inserire nel database. Se utilizzi un framework persistente, raccoglierà automaticamente le chiavi.

    
risposta data 07.11.2010 - 00:10
fonte
1

Entrambi sono decisamente la strada da percorrere. Avrai bisogno di logica di validazione nel tuo codice per evitare aggiornamenti e inserimenti sbagliati e per dire agli utenti cosa è successo e come risolverlo. E avere il database lì per eseguire il back-stop delle cose, quindi se qualcosa è entrato e non è stato eseguito attraverso la convalida, non sarebbe stato un errore.

Dovresti mantenere il database di livello superiore. Ad esempio, far rispettare l'integralità referenziale e forse alcuni non nulla. Ma non preoccuparti di limitare lunghezze o formati poiché è meglio renderlo interamente all'applicazione.

    
risposta data 26.01.2012 - 14:33
fonte

Leggi altre domande sui tag