Perché le relazioni polimorfiche di prima classe non sono possibili nei database relazionali?

4

Diciamo che voglio impostare una tabella roles che abbia una relazione polimorfica con resource .

Capisco che potrei impostare direttamente una chiave esterna - aggiungendo ad esempio una colonna roles.forum_id .

Ma perché (AFAIK) la creazione di una chiave estranea composta in cui una colonna contiene la chiave e un'altra la tabella a cui fare riferimento non è possibile?

    
posta papirtiger 25.09.2016 - 23:24
fonte

2 risposte

6

Una colonna di chiave esterna fa riferimento a una singola tabella. Se si desidera fare riferimento a una tabella diversa come chiave esterna, è necessario disporre di una colonna chiave diversa o seconda chiave esterna. Non puoi avere una singola colonna che sia un tipo di unione di chiavi esterne diverse (la prima colonna della tua chiave composta suggerita). Non esiste nemmeno un tipo di colonna per la tabella stessa (la seconda parte della chiave composta suggerita).

Puoi simulare ciò usando stringhe per le chiavi e le stringhe per le tabelle (yuk!), ma avrà un impatto drammatico su tutte le tue tabelle e le loro query.

Tutto questo fa parte di ciò che è noto come Corrispondenza relazionale all'oggetto .

Il polimorfismo per classe non è semplicemente una caratteristica del modello relazionale standard, sebbene alcuni database specifici includano l'ereditarietà come estensione.

Il supporto per il polimorfismo e / o l'ereditarietà è presente principalmente nel modello relazionale come attributi: (1) gli attributi possono essere facoltativi, ovvero possono memorizzare null invece di un valore e (2) nuovi attributi possono essere aggiunti a piacimento per supporta nuove sottoclassi. Quindi, probabilmente la mappa più pulita di una classe con sottoclassi è quella di modellare ogni attributo nella stessa tabella singola, con attributi per sottoclassi come attributi opzionali, mentre gli attributi per la classe base sono obbligatori (se così fosse).

Funziona piuttosto bene per alcune cose, ma non è perfetto almeno nel seguente:

  1. non esiste un'identificazione speciale di quale sottoclasse è vera una particolare riga e,
  2. non c'è modo di garantire che gli attributi richiesti di una determinata sottoclasse siano tutti presenti quando la riga è intesa come un'istanza di quella particolare sottoclasse (perché dovevamo contrassegnare gli attributi della sottoclasse come facoltativi).

Per ulteriori informazioni sulla modellizzazione dell'ereditarietà nei db relazionali, vedi:

risposta data 25.09.2016 - 23:45
fonte
0

È perfettamente possibile modellare i dati polimorfici in un database relazionale. Per esempio. una serie di chiavi esterne nullable per ogni tabella di tipi di risorse e un vincolo che esattamente uno non è nullo.

    
risposta data 25.09.2016 - 23:43
fonte

Leggi altre domande sui tag