Come prevenire query ricorsive profondi con entità costituite da enti dello stesso tipo? [Esempio all'interno di Cool]
Domanda
Nessun problema! Sembra più complessa di quanto non sia in realtà! Basta avere fino alle bevande!
TLDR-versione :? Come efficiente query e le entità che hanno relazioni con altre entità update
Ecco un interessante scenario di modellazione dei dati con due tavoli che mi è stata sconcertante:
Entities { ID, Name, ScalarValue }
ComponentEntities { AggregateEntityID, ComponentEntityID, quantity }
AggregateEntityID
e ComponentEntityID
sono chiavi esterne alla tabella Entities
.
Mi dia l'esempio sanguinosa già
Drinks { ID, Name, Alcohol% }
DrinkIngredients { CocktailID, IngredientID, amount }
Drinks { 1, "Vodka", 40% }
Drinks { 2, "Tomato juice", 0% }
Drinks { 3, "Tabasco", 0% }
Drinks { 4, "Bloody mary", - }
DrinkIngredients { 4, 1, 0.2 } // Bloody mary has 0.2*Vodka
DrinkIngredients { 4, 2, 0.7 } // Bloody mary has 0.7*Tomato juice
DrinkIngredients { 4, 3, 0.1 } // Bloody mary has 0.1*Tabasco
Se volessimo ottenere sanguinosa gradazioni alcoliche di Maria, avremmo SELECT * FROM DrinkIngredients WHERE CocktailID == 4
.
Piuttosto standard; nulla di strano c'è. Lisa piace per renderlo un po 'più dolce con l'aggiunta di un po' di passione ad esso:
Drinks { 6, "Passion", 13% }
Drinks { 7, "Bloody Mary Pink", - }
DrinkIngredients { 7, 4, 0.8 } // Bloody Mary Pink has 0.8*Bloody Mary
DrinkIngredients { 7, 6, 0.2 } // Bloody Mary Pink has 0.2*Passion
La mamma di Lisa è stato degustazione questi per così tanto tempo che lei crede di aver trovato la miscela finale tra i due:
Drinks { 8, "Bloody Milf", - }
DrinkIngredients { 8, 4, 0.45 } // Bloody Milf has 0.45*Bloody Mary
DrinkIngredients { 8, 7, 0.55 } // Bloody Milf has 0.55*Bloody Mary Pink
Aggiungi altro paio di questi si compone di i livelli e abbiamo una ricorsione relazionale profondo. L'unica restrizione è che un'entità non può consistere in sé.
Questo sembra formare un diretto aciclico grafico .
RDBMS: Un modo per "cache" i dati sarebbe quello di calcolare i dati rilevanti e memorizzarlo nella propria Entità (o forse in un'altra tabella). Nell'esempio di cui sopra, il contenuto di alcool per Bloody Mary avrebbe calcolato una volta quando viene creato e memorizzato nel suo settore Alcool%. In questo caso, gli aggiornamenti diventano costosi perché dobbiamo aggiornare ogni bevanda (insieme con l'intera gerarchia delle dipendenze) che consiste di quello nuovo.
Domande
RDBMS:? C'è un modo migliore per raggiungere i valori foglia (bevande che non consistono in altri quelli) di ottenere la bevanda "padre" fino a raggiungere una bevanda foglia
Sia, RDBMS e NoSQL, hanno un problema con questo:. In un modo o l'altro
Bottom-line: è questo anche pratico e fattibile
Che cosa ho bisogno è un contro-inizio
Soluzione
"RDBMS: C'è un modo migliore per raggiungere i valori foglia (bevande che non sono costituiti da altri quelli) che ottenendo il ''? Bevanda fino a raggiungere una bevanda foglia" genitore
Non capisco questo. Le bevande che non consistono in altri quelli non ha nulla a che fare con la ricorsione. E 'un semplice SALVO o DOVE NON ESISTE.
E "per raggiungere i valori foglia" (dato un genitore) richiederà inevitabilmente attraversare l'albero, indipendentemente dalla struttura dei dati (relazionale o gerarchico) utilizzato per modellare esso, non sarebbe pensi?
Sia, RDBMS e NoSQL, hanno un problema con questo:. In un modo o l'altro
RDBMS in realtà non hanno un problema con questo. Il problema è stato già identificato a pochi decenni fa (80 o giù di lì), ed è stato affrontato modificando l'algebra relazionale con un'operazione di chiusura transitiva, e una versione generalizzata di esso. SQL supporta questo attraverso query ricorsive, e come ha detto Frank, almeno tutti i cani di grossa taglia tutti supporta le query ricorsive in un modo o l'altro.
Bottom-line: è questo anche pratico e fattibile "
scrittura di query ricorsive non è esattamente banale se non hai mai fatto prima. Questo la rende "poco pratico"? Non saprei.
Altri suggerimenti
Molti RDMSs supportano query ricorsive. Vedere e. g. http://msdn.microsoft.com/en-us/library/ms186243. aspx .