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

alt text

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top