risposta

56

I vincoli del database non sono più necessari rispetto all'utilizzo delle cinture di sicurezza nell'automobile. Puoi guidare tutto ciò che ti piace e tutto funzionerà alla grande fino all'arrivo di un problema. La cintura di sicurezza (vincoli) ti tiene al sicuro (i dati).

Quindi è altamente raccomandato creare vincoli per imporre l'integrità dei dati a livello di database, perché è altamente probabile che 1) interagirai con il database ad un certo punto al di fuori di Rails e 2) Farai un errore in il tuo codice che causa dati non validi.

I vincoli del database possono essere più utili, ma consente di risparmiare un sacco di lavoro, soprattutto quando il codice può fare ipotesi sui dati e non deve fare tonnellate di controlli di validità.

La ragione per cui ActiveRecord non supporta le chiavi esterne out-of-the-box è perché è inteso per essere indipendente dal database e le chiavi esterne non sono universalmente supportate da tutti i sistemi di database.

+13

Mi piace l'analogia con la cintura di sicurezza! – Zabba

+1

Un altro motivo: a meno che l'app Rails non sia un processo, un thread, eseguito su un singolo server, può elaborare più richieste contemporaneamente. Cose come 'convalida: username, unicità: true' possono fallire in questo caso, perché ogni istanza dell'app controlla il nome utente richiesto, non lo trova e lo inserisce. Solo un indice unico lo impedisce. In generale, qualsiasi controllo come "questo dato è valido dato cosa c'è nel database ** adesso **?" può essere fatto in modo affidabile solo dal database stesso. –

9

È possibile aggiungere il supporto per chiave esterna con il plug-in Foreigner.

Non tutti i database supportati per ActiveRecord supportano chiavi esterne, quindi il framework Rails non lo include come caratteristica principale.


Nota: quanto sopra non è più preciso, come Rails added FK support in 4.2.

+0

lo so ..... voglio solo sapere ... ci serve questo ??? ..... – jojo

+2

La risposta breve è, sì è importante ma per impostazione predefinita devi usare ': options' hash. ActiveRecord vive a un livello di astrazione in cui non può assumere il supporto per le FK. –

Problemi correlati