Rappresenta una gerarchia padre / figlio in un database relazionale

3

Sto lavorando su un'applicazione che si connette a un'altra applicazione (Quickbooks) utilizzando un'API inviando / ricevendo richieste / risposte XML. Sono in grado di lavorare con i dati nella risposta XML e caricarlo in un datatable in c #, quindi non è questo il problema. Quello che sto cercando di fare è scrivere i dati dal file XML Quickbooks in un database relazionale come SQL Server in modo che io possa renderlo disponibile per un'app Web o altre applicazioni.

Il problema che sto avendo è che per l'oggetto Account, ci sono più entità figlio (fino a 5) per un dato genitore. Ad esempio:

  • Parent: Ricavi
  • Bambino: donazioni di beneficenza
  • Sotto-bambino: Rifugio per senzatetto
  • Sotto-secondario: missione di Seattle
  • Sotto-sotto-sotto-bambini: cibo

Questo esempio è un po 'estremo, dato che il particolare file con cui sto lavorando va solo a tre livelli, ma un massimo di cinque è consentito da Quickbooks (quindi sto cercando di trovare una soluzione che ridimensiona bene). Quando creo il mio datatable in C # dai dati nel file XML, ho due colonne: ParentID, ChildID. Sarebbe come questo:

ParentID     ChildID     Account               Balance
--------     -------     -------               --------
001          002         Revenues              45670
002          003         Charitable Donations   1500
003          004         Homeless Shelter        800
004          005         Seattle Mission         400
005          NULL        Food                    200

In questo esempio, sono in grado di determinare tutti gli ID figlio di un genitore, quindi guardare al ParentID con quel ChildID e vedere se quel figlio ha figli, ecc. Ho un metodo che fa un discreto lavoro di analisi attraverso questo, e funziona bene per il momento, ma questo è davvero il modo migliore per archiviarlo in un database se volessi ospitare in modo permanente i dati in un database relazionale? Sembra che ci dovrebbe essere una soluzione più elegante, ma non sono sicuro di cosa sarebbe.

    
posta Ryan 03.05.2013 - 07:00
fonte

1 risposta

8

Se ti capisco correttamente, hai un'entità Account in cui un account può collegarsi a uno o più account.

La soluzione canonica per memorizzare tale relazione in un database relazionale consiste nel dare a ciascuna riga della tabella degli account una chiave esterna che rimandi alla voce padre nella tabella.

Nel tuo esempio, questo sarebbe simile a questo:

ID  Parent  Account name          Balance
--- ------  ------------          -------
1   NULL    Revenues              45670
2   1       Charitable Donations   1500
3   2       Homeless Shelter        800
4   3       Seattle Mission         400
5   4       Food                    200
6   4       Housing                 100

Ho aggiunto una riga in più per mostrare come questo schema consente a un genitore di avere più voci figlio. Filtrando sulle colonne di destra, puoi recuperare sia il genitore che i figli di ogni voce.

    
risposta data 03.05.2013 - 09:59
fonte

Leggi altre domande sui tag