Wie tief rekursive Abfragen mit Entitäten zu verhindern, von Einheiten des gleichen Typs aus? [Cool Beispiel innen]
Frage
Keine Sorge! Es sieht viel komplexer als es tatsächlich ist! get down nur für die Getränke!
TLDR-Version : Wie effizient Abfrage und Aktualisierung von Entitäten Beziehungen zu anderen Unternehmen mit
Hier ist eine interessante Datenmodellierung Szenario mit zwei Tabellen, die mich ist rätselhaft:
Entities { ID, Name, ScalarValue }
ComponentEntities { AggregateEntityID, ComponentEntityID, quantity }
AggregateEntityID
und ComponentEntityID
sind Fremdschlüssel auf die Tabelle Entities
.
Gib mir das blutige Beispiel bereits
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
Wenn wir Bloody Mary den Alkoholgehalt erhalten wollten, würden wir SELECT * FROM DrinkIngredients WHERE CocktailID == 4
.
Pretty-Standard; es gibt nichts seltsam. Lisa mag es ein wenig süßer zu machen, indem einige Leidenschaft ihn hinzufügen:
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
Lisas Mama hat schon so lange diese schmecken, dass sie glaubt, sie hat die ultimative Mischung zwischen den beiden gefunden:
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
Fügen paar mehr von diesen besteht aus Ebenen und wir haben eine tiefe relationale Rekursion. Die einzige Einschränkung ist, dass Unternehmen nicht von selbst bestehen können.
Dies scheint ein gerichtetes azyklischen Graphen zu bilden.
RDBMS: Ein Weg, um „Cache“ würden die Daten relevante Daten zu berechnen und speichern sie in der Entity selbst (oder vielleicht in einer anderen Tabelle). In dem obigen Beispiel würde der Alkoholgehalt für Bloody Mary einmal berechnet, wenn es in seinem Alkohol% Feld erstellt und gespeichert wird. In diesem Fall werden Updates teuer, weil wir jeden Drink aktualisieren (zusammen mit der ganzen Abhängigkeitshierarchie), die aus dem aktualisierten ein.
Fragen
RDBMS: Gibt es einen besseren Weg, um die Blattwerte (Getränke, die sich aus anderen nicht bestehen) zu erhalten, als sich die „Eltern“ Getränk, bis ein Blatt Getränk erreicht ist
Sowohl RDBMS und NoSQL, haben ein Problem damit. Die eine oder die andere
Bottom-line: das ist auch praktisch und machbar
Was ich brauche, ist ein Gegen Anfang
Lösung
„RDBMS: Gibt es einen besseren Weg, um die Blattwerte (Getränke, die sich aus anderen nicht bestehen) zu erhalten, als sich das‚?‘Getränk, bis ein Blatt Getränk erreicht ist“ parent
Diese Mitteilung nicht verstehen. Getränke, die nicht von anderen diejenigen bestehen, hat nichts mit Rekursion zu tun. Es ist eine einfache AUSSER oder WO NICHT VORHANDEN.
Und „an den Blattwerte bekommen“ (da ein Elternteil) erfordert zwangsläufig den Baum durchlaufen, unabhängig von der Datenstruktur (relational oder hierarchisch) verwendet es zu modellieren, nicht wahr?
Sowohl RDBMS und NoSQL, haben ein Problem damit. Die eine oder die andere
RDBMS hat nicht wirklich ein Problem damit. Vor Das Problem wurde schon ein paar Jahrzehnte identifiziert (80ere Jahre oder so), und wurde durch eine Änderung der relationale Algebra mit einem transitiven Schließvorgang und eine verallgemeinerte Version davon gerichtet. SQL unterstützt dies durch rekursive Abfragen, und als Frank sagte, zumindest alle großen Hunde alle Unterstützung rekursive Abfragen der einen oder der anderen Seite.
Bottom-line: das ist auch praktisch und machbar "
ist rekursive Abfragen Schreiben nicht gerade trivial, wenn Sie es noch nie zuvor getan haben. Ist, dass es „unpraktikabel“ machen? Ich möchte nicht wissen.
Andere Tipps
Unterstützung Viele RDMSs rekursive Abfragen. Siehe e. G. http://msdn.microsoft.com/en-us/library/ms186243. aspx .