Esiste un nome per questo tipo di vincolo del database? "Chiave esterna funzionale"? Ed è una buona idea?

1

Diciamo che vogliamo far rispettare che una tabella rappresenta un albero. Ho trovato questo metodo per farlo:

create table tree (
  id integer[] primary key,
  parent integer[] references tree (id),
  item text not null,
  constraint tree_parent check (
       (id = array[]::integer[] and parent is null)
    or parent = id[1:array_length(id,1)-1])
);

Un nodo nell'albero è identificato dal suo percorso dal nodo radice. In quanto tale, la chiave esterna parent è solo quel percorso con un elemento lasciato cadere alla fine. La combinazione di foreign key e check garantisce la struttura ad albero.

Prima domanda: questa è una buona idea? Ci sono approcci migliori? In Oracle, almeno, sono in grado di definire parent come una colonna virtuale, che è elegante.

Seconda domanda: esiste un nome per questo approccio? Mi piace pensare a questo come a una "chiave esterna funzionale": tree.id riferimenti tree.id , ma tramite una funzione che rilascia l'ultimo elemento nel percorso. Penso che questo concetto abbia un uso più generale rispetto all'esempio dell'albero sopra.

    
posta jameshfisher 15.03.2013 - 22:08
fonte

1 risposta

1

1) Puoi spiegare meglio il tuo vincolo di controllo. Cosa vuoi controllare esattamente? Circles?

Se stai andando a controllare l'intero percorso per l'elemento su INSERT, questo può costare un buon tempo ... ogni salto significa indicizzazione della ricerca di una chiave.

2) Non vedo come si possa rendere 'genitore' una colonna virtuale, cioè una colonna calcolata ... Sarà calcolata da dove?

Penso che la colonna "genitore" sia necessaria per salvare sul collegamento del disco a un elemento genitore.

    
risposta data 17.08.2013 - 16:22
fonte

Leggi altre domande sui tag