Le tabelle dei database relazionali possono sempre essere ordinate topologicamente in base alla loro relazione di riferimento FK?

1

Supponiamo di avere un diagramma E-R concettuale, non fisico, che descriva un database relazionale. Voglio ordinare tutte le tabelle nel database usando un ordinamento topologico, in cui l'ordinamento parziale tra le tabelle è la Tabella 1 ha una chiave esterna nella Tabella 2.

Quando si eliminano le tabelle dopo aver inserito i dati di test, è necessario prima cancellare la tabella 1, quindi la tabella 2, per non violare i riferimenti FK. Un ordinamento topologico sulla relazione FK mi dà un ordine per cancellare le tabelle.

È possibile avere una tabella con un FK a sé stessa, fornendo un semplice esempio di contatore in cui vi è un ciclo e, successivamente, nessun ordinamento topologico. Tuttavia, questa relazione personale può anche essere rappresentata usando una tabella di join, che elenca 2 righe della tabella, in cui una fa riferimento all'altra, e in questo caso ci sarebbe un ordinamento topologico.

Sostituendo i riferimenti FK diretti tra tabelle con tabelle join, è sempre possibile arrivare a una struttura che può essere ordinata topologicamente?

    
posta user2800708 23.04.2015 - 17:53
fonte

2 risposte

1

Sembra che io sia possibile sbarazzarsi banalmente dei cicli spostando tutte le chiavi esterne per unire le tabelle.

Dopo aver spostato tutte le chiavi esterne per unirle alle tabelle, nessuna delle tabelle originali ha dipendenze su nulla. Le tabelle di join hanno dipendenze sulle tabelle originali. Niente ha dipendenze dalle tabelle di join. Di conseguenza, hai un ordinamento topologico banale: prima il join, poi le tabelle originali.

In nessuna circostanza dovresti davvero contemplare di farlo. Stai complicando enormemente il tuo modello di dati senza troppi benefici.

When clearing out tables after putting test data in them, I would need to delete Table 1 above first, then Table 2, in order to not violate FK references. A topological sort on the FK relation gives me an ordering to clear the tables in.

Se hai davvero bisogno di cancellare i dati del test in questo modo, puoi fare quanto segue:

  1. Imposta tutte le chiavi esterne su NULL
  2. Elimina tutto

Ma dovresti prendere in considerazione alcune altre alternative:

  1. Puoi fare tutto all'interno di una transazione che ti consente semplicemente il tuo rollback quando hai terminato?
  2. Puoi creare e popolare un database temporaneo che puoi semplicemente buttare via quando il test è terminato?
risposta data 23.05.2015 - 20:59
fonte
0

Bene, se ho capito bene, se c'è un ciclo da qualche parte lungo il percorso, allora non puoi avere un ordinamento topologico. Anche se risolvi il problema del ciclo nel caso di un FK dalla tabella A a se stesso (non ho capito cosa intendi esattamente con il termine "join table", ma è certamente a causa della mia mancanza di esperienza con i database) potrebbe sempre avere un ciclo tra N tavoli.

Nell'ultimo caso dovresti considerare le risorse necessarie per risolvere quel caso particolare (assumendo che tu vada con l'approccio "join table"). Potresti fare un ordinamento topologico di un sottoinsieme di tabelle anche se non hai cicli.

    
risposta data 23.04.2015 - 19:36
fonte

Leggi altre domande sui tag