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

alt text

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top