5

Sto progettando un piccolo database per un progetto personale, e uno dei tavoli, chiamiamolo tabella C, deve avere una chiave esterna a una delle due tabelle, chiamarli A e B, a seconda della voce. Qual è il modo migliore per implementarlo?Come gestire una relazione "OR" in un progetto ERD (tabella)?

Idee finora:

  • creare la tabella con due campi chiave nullable stranieri che collegano alle due tabelle.
    • Possibilmente con un trigger per rifiutare inserimenti e aggiornamenti che risulterebbero 0 o 2 di essi nulli.
  • due tavoli separati con dati identici
    • Questo rompe la regola di duplicazione di dati.

Che cosa è un modo più elegante per risolvere questo problema?

+1

Aggiunto il tag 'polymorphic-association' perché è un termine comune per questo tipo di relazione. –

risposta

10

Stai descrivendo un progetto chiamato Associazioni polimorfiche. Questo spesso mette le persone nei guai.

Io, di solito consiglio:

A --> D <-- B 
     ^
     | 
     C 

In questo progetto, si crea una tabella genitore comune D che sia A e B di riferimento. Questo è analogo a un supertipo comune nel design OO. Ora la tabella figlio C può fare riferimento alla super-tabella e da lì puoi accedere alla rispettiva sotto-tabella.

Tramite i vincoli e le chiavi composte è possibile assicurarsi che una determinata riga in D possa essere referenziata solo da A o B ma non entrambi.

+0

Grazie, ora per il refactoring. –

1

Se sei sicuro che C si riferirà solo a una di due tabelle (e non a una di N), la tua prima scelta è un approccio ragionevole (ed è quello che ho usato prima). Ma se pensate che il numero di colonne di chiavi straniere continuerà ad aumentare, questo suggerisce che ci sono alcune similitudini o sovrapposizioni che potrebbero essere incorporate, e potreste voler riconsiderare.

Problemi correlati