È una cattiva idea creare chiavi esterne sulle tabelle in schemi diversi nello stesso database per grandi applicazioni?


13

Sto lavorando al trasferimento di una grande applicazione basata su web pl / sql sul server dedicato. Questa applicazione si trova in uno schema con 70 pacchetti di codice programmato. Questa applicazione è stata presentata all'incirca all'incirca 15 persone in tempi diversi. Ed era pratica normale per noi creare chiavi esterne sulle tabelle di riferimento in schemi diversi perché è davvero conveniente e mantiene il database molto pulito, perché non è necessario mantenere le stesse tabelle di riferimento in schemi diversi.

Ma comunque il mio DBA (che ha creato una nuova istanza con DB e ha copiato la mia applicazione all'interno della zona di Solaris) ha dichiarato oggi molto duramente: "Le chiavi esterne sui diversi schemi sono malvagie e devi distruggerlo!". Non ha spiegato il suo punto di vista.

È davvero una cattiva idea farlo con grandi applicazioni?


13
Il tuo DBA dovrebbe essere licenziato.
Colin 't Hart,

1
Grideremo tutti che il tuo DBA è un idiota se è tutto quello che hanno detto, ma sei sicuro che non ci fosse altro contesto nell'argomento del tuo DBA?
Kermit,

1
forse il DBA sta solo facendo del suo meglio per supportare il lavoro ridicolo che gli sviluppatori hanno fatto nel costruire questa cosa.
swasheck,

2
@swasheck D'altra parte, fa si vuole avere il suo lavoro dopo che il database ha accumulato diversi anni di incongruenze in questo DBA?
Scintillii il

@Twinkles no affatto
swasheck

Risposte:


6

Abbi pazienza: vengo da SQL Server e odio l'oracolo, ma penso che l'argomentazione sia ancora valida.

Gli schemi sono utili per isolare le tabelle dai sottosistemi logici. Le chiavi esterne garantiscono l'integrità dei dati. Questi sono concetti ortogonali - poiché ovviamente è indispensabile anche l'integrità dei dati tra sottosistemi. Contabilità e spedizione e possibilmente i dati CUstomer centrali non vivono in silos in cui un cliente può essere cancellato mentre viene utilizzato in contabilità.

In quanto tale, penso che il requisito della DBA sia un segno di incompetenza. Per favore, chiunque può intervenire e fornire una contro-argomentazione - sarei felice. Ma è così che lo faccio su SQL Server (sebbene, ancora una volta, la nostra definizione di schema sia IIRC un PICCOLO diverso dalla definizione di Oracle).


4

Mentre richiedere la distruzione di vincoli di chiave esterna senza ragionamenti dettagliati è sciocco, ha senso tenere sotto controllo i riferimenti esterni. Cosa succede se gli schemi a cui si fa riferimento sono denominati in modo diverso sul nuovo server?

In Oracle risolvi questo problema creando SYNONYMS per oggetti al di fuori dello schema corrente.


1
Puoi abusare dei sinonimi e confondere ulteriormente la domanda "a cosa si riferisce questo?". Vedi qui per maggiori dettagli su sicurezza, le prestazioni e le migliori pratiche stackoverflow.com/a/10042117/851930~~V~~plural~~3rd
kevinsky

3
I sinonimi non possono essere utilizzati come target di vincoli di chiave esterna.
Colin 't Hart,

Punti validi. E un'ulteriore prova del fatto che fare dichiarazioni senza dare agli altri l'opportunità di argomentare meriti e pericoli è negativo.
Scintillii

2

Se hai la necessità (spazio / sicurezza / qualunque cosa) di spostare qualsiasi schema in un database diverso, non sarai più in grado di gestire i riferimenti. Questo è probabilmente il motivo principale per richiedere di uccidere i riferimenti.


0

L'unica "cattiva idea" che posso immaginare facendo questo, è che non puoi concedere il privilegio di oggetto REFERENCES (quello necessario per creare un vincolo che si riferisce a una tabella) a un ruolo. Devo fare schema / utente per schema / utente.

Oltre a ciò, non vedo il punto del tuo DBA.


0

Basti pensare a questo: lo schema del proprietario della tabella figlio inizia a creare record nella sua tabella e impedisce inconsapevolmente all'utente dello schema della tabella padre di eliminare i record dalla tabella padre. È qualcosa che anticipa e apprezza?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.