Ho un set di dati gerarchici utilizzati in un database SQL Server. I dati sono memorizzati con un guid come chiave primaria e una parentGuid come una chiave esterna che punta agli oggetti parent immediati. Accedo i dati più spesso tramite Entity Framework in un progetto WebApi. Per rendere la situazione un po 'più complessa, devo anche gestire i permessi basati su questa gerarchia in modo tale che un'autorizzazione applicata a un genitore si applichi a tutti i suoi discendenti. La mia domanda è questa:Dati SQL gerarchici (tabella CTE ricorsiva vs gerarchico o tabella di chiusura)
Ho cercato dappertutto e non posso decidere quale sia la soluzione migliore per gestire questa situazione. So di avere le seguenti opzioni.
- Posso creare
Recursive CTEs
, Common Table Expression, (aka RCTE) per gestire i dati gerarchici. Questo sembra essere l'approccio più semplice per l'accesso normale, ma sono preoccupato che potrebbe essere lento quando viene utilizzato per determinare i livelli di autorizzazione per gli oggetti figlio. - Posso creare un campo di tipo dati
hierarchyId
nella tabella e utilizzare funzioni fornite da SQL Server comeGetAncestor()
,IsDescendantOf()
e così via. Sembra che renderebbe l'interrogazione abbastanza semplice, ma sembra richiedere un trigger di inserimento/aggiornamento piuttosto complesso per mantenere corretto il campo della gerarchia ID tramite inserimenti e spostamenti - Posso creare uno
closure table
, che memorizzerebbe tutte le relazioni nella tabella. Lo immagino come tale: colonna genitore e colonna figlio, ogni genitore -> relazione figlio sarebbe rappresentata. (cioè 1-> 2 2-> 3 sarebbe rappresentato nel database come 1-2, 1-3, 2-3). Lo svantaggio è che questo richiede l'inserimento, l'aggiornamento e l'eliminazione dei trigger anche se sono abbastanza semplici e questo metodo genera molti record.
Ho provato a cercare dappertutto e non riesco a trovare nulla che dia qualche consiglio tra questi tre metodi.
PS io sono aperto anche ad eventuali soluzioni alternative a questo problema
Contrassegnare la domanda con la versione di SQL Server che si sta utilizzando. Le tue domande tendono a passare dal bambino al genitore o viceversa? Un RCTE che cammina sull'albero seguendo i link padre per un singolo figlio non dovrebbe essere troppo cattivo. Andare dall'altra parte per tutti i bambini è dove rallenta. – HABO
Non riesco a controllare la versione ora, ma lo farò in seguito. Penso che sia il 2008 o il più recente. È probabile che diventi più spesso genitori di figli che genitori di bambini – jp36
Non riesco ad aggiungere un altro tag, ma è SQL Server 2008 r2. – jp36