Se tutti i riferimenti alle tabelle esterne utilizzano vincoli di chiave esterna

0

Strettamente correlato a: link

Ho chiesto una domanda su SO e mi ha portato a chiedere questo qui.

Se mi trovo di fronte a una scelta di avere un riferimento circolare o semplicemente non imporre il contenimento, qual è la scelta migliore?

Nel mio caso particolare ho clienti e indirizzi. Voglio che un indirizzo abbia un riferimento a un cliente e voglio che ogni cliente abbia un ID indirizzo di fatturazione predefinito e un ID indirizzo di spedizione predefinito.

Potrei richiedere tutti gli indirizzi che hanno un determinato ID cliente o potrei richiedere l'indirizzo con l'ID che corrisponde agli ID degli indirizzi di fatturazione o di spedizione predefiniti.

Non sono ancora sicuro di come i vincoli (o la mancanza di) influenzeranno il sistema come la mia applicazione e i suoi dati invecchiano.

    
posta TecBrat 06.05.2014 - 21:08
fonte

2 risposte

4

Innanzitutto, se ti trovi a creare un sistema in cui tabella A riferimenti tabella B e tabella B riferimenti tabella A , che spesso implica che hai violato le regole di normalizzazione nella costruzione del tuo modello dati. Molto, molto occasionalmente, puoi farlo perché hai misurato e benchmark e la denormalizzazione risolve un particolare problema di prestazioni. La stragrande maggioranza delle volte, però, significa che vuoi davvero riconsiderare il modello dei dati.

In questo caso, suggerirei caldamente di riconsiderare il modello dei dati. Un cliente ha uno o più indirizzi. Un indirizzo non ha un cliente. Non ha senso il modello dei dati per una tabella address per avere un riferimento a una tabella customer o a vendor . Potrebbe avere senso che una tabella customer abbia un riferimento a una tabella address ma in genere avrebbe più senso creare una tabella di mapping tra le tabelle customer e address (e tra vendor e address ) come indicato nella domanda StackOverflow.

Se stai costruendo un sistema OLTP, ti suggerisco caldamente di creare chiavi esterne per far rispettare i vincoli di integrità referenziale che i tuoi dati hanno. In caso contrario, posso garantire che qualcuno alla fine crei incoerenze nei dati (bambini orfani, riferimenti a bambini inesistenti, ecc.) Sì, la creazione di chiavi esterne aggiunge un sovraccarico dal punto di vista delle prestazioni. Ma supponendo che ti interessi per i dati ha senso, dovrai controllare quei vincoli da qualche parte ed è improbabile che tu possa farlo in modo più efficiente di quanto possa fare il database.

    
risposta data 07.05.2014 - 17:31
fonte
0

Tutti i riferimenti alle tabelle straniere dovrebbero utilizzare vincoli di chiave esterna?

Risposta breve "No" o "Non necessariamente"

Risposta lunga. Considera in che modo i tuoi dati si relazionano tra loro e in quali circostanze desideri impedire una modifica. (Come non lasciare che un indirizzo venga cancellato se è ancora assegnato ad un'altra entità.) Lascia che ti guidi nel decidere IF dovresti usare il vincolo FK.

    
risposta data 07.05.2014 - 17:18
fonte

Leggi altre domande sui tag