12

Associazioni polimorfiche (PA) è piuttosto un boccone per un requisito di database relativamente semplice: consentire a varie tabelle di avere record figlio in una tabella condivisa. L'esempio classico è una singola tabella con record di commenti che si applicano a entità non necessariamente affini.Come implementare le associazioni polimorfiche in un database esistente

In this question Mark ha svolto un lavoro eccellente mostrando tre approcci comuni per implementare gli AP. Voglio usare l'approccio alla tabella di base, che è descritto in modo più dettagliato in un altrettanto eccellente answer by Bill Karwin.

Un esempio concreto sarebbe simile a questa:

enter image description here

Le chiavi primarie delle entità riferiscono ai valori di chiave identici nella tabella di base e la tabella osservazione riguarda alla tabella di base, l'integrità così referenziale è osservato. La parte cruciale qui è che le chiavi primarie delle tabelle delle entità hanno distinti domini. Vengono generati creando un nuovo record nella tabella di base e copiando la sua chiave generata sulla chiave primaria dell'entità.

Ora la mia domanda: cosa se voglio introdurre di integrità referenziale in un database esistente con le entità che generano i loro propri, chiavi primarie reciprocamente sovrapposte PA?

Finora, vedo due opzioni:

Opzione 1:

Option 1

Ogni entità mantiene la propria chiave primaria, ma ottiene anche una chiave alternativa.

come:

  • Vicino l'approccio consigliato.
  • La tabella di base è stabile.

piace:

  • entità esistenti devono essere modificati.
  • Difficile trovare l'entità proprietaria di un commento.

Opzione 2:

Option 2

Ogni entità ha una propria colonna chiave esterna nella tabella di base. Questo assomiglia all'approccio a colonne multiple di Mark.

come:

  • entità esistenti non sono interessate.
  • Facile trovare l'entità proprietaria di un commento.

piace:

  • colonne di tipo sparse
  • Base tavolo non è stabile: necessita di una modifica quando viene introdotta una nuova entità con PA

mi appoggio all'opzione 1, possibilmente con un campo "EntityName" nella tabella Base per la ricerca bidirezionale. Quale opzione sarebbe meglio. O è un altro, ancora meglio, approccio?

+0

Opzione 1 sarebbe più facile da mantenere. Se devi continuare ad aggiungere colonne alla tua tabella di base, sarà una seccatura e richiederà molta manutenzione a causa di divisioni di pagina e puntatori e simili. – JNK

+0

@JNK Buon punto, l'impatto sull'immagazzinamento fisico è importante da tenere a mente. –

+0

È possibile utilizzare l'Opzione 1 ma non con una chiave alternativa surrogata aggiuntiva. La nuova chiave alternativa può essere la chiave primaria esistente (di ogni entità), estesa con una colonna 'EntityType' (ad esempio' CHAR (1) ', che sarebbe' E' per Eventi, 'P' per Persone,' D' per prodotti) –

risposta

9

È possibile utilizzare l'Opzione 1 senza una chiave alternativa sostitutiva alternativa.

invece, estendere la chiave primaria esistente (di ogni entità), con una colonna EntityType (diciamo CHAR(1), che sarebbe E per Eventi, P per le persone, per i prodotti D).

Il composto (EntityId, EntityType) diventerà quindi la chiave primaria della tabella Entity e i composti corrispondenti nelle altre 3 sottotipi.

(Il EntityType è solo un ausiliario, tabella di riferimento, con 3 righe):

Polymorphic_Associations

Problemi correlati