2012-03-27 5 views
6

Dies ist ein Follow-up auf meine Fragen hier:
How to implement a many-to-many hierarchical structure in MySQL
und hier:
How to record sequential collections of records in MySQL.Wie wird eine Sortierreihenfolge zu einer MySQL-Verschlusstabelle hinzugefügt, die eine Viele-zu-Viele-Beziehung darstellt?

Kurz gesagt, ich möchte in MySQL eine Tabelle von Rezepten und eine andere Anleitung implementieren. Ein Rezept ist eine sequentielle Reihe von Anweisungen oder andere Rezepte. So könnten Sie zum Beispiel ein Rezept vorstellen, und ein Peach_tart, das die , plus eine Reihe anderer Schritte (Anweisungen) verwendet. Peach_preserve könnte für viele andere Rezepte verwendet werden.

Ich lese this blog post by Bill Karwin about closure tables, und ich denke, dass diese Lösung meine Herausforderungen am besten anspricht (meine Hierarchie ist viele-zu-viele und die Schritte sind sequenziell). So zum Beispiel hätte ich:

recipe 
id name 
1 Peach preserve 
2 Cubed peeled peaches 
3 Fresh peaches 
4 Powdered sugar 
5 Cook together 
6 Peel and cut in chunks 
7 Mix 

step (or instruction) 
id desc 
1 Cook together 
2 Buy peaches 
3 Buy sugar 
4 Peel and cut in chunks 
5 Mix 

recipe_instruction 
(Ancestor) (Descendant) 
recipe_id step_id depth descendant_is_instruction 
3   3   0  0 
3   2   1  1 
4   4   0  0 
4   3   1  1 
6   6   0  0 
6   4   1  1 
2   2   0  0 
2   3   1  0 
2   2   2  1 
2   6   1  0 
2   4   2  1 
(and so on...) 

Ich bin kein Fan der descendant_is_instruction Flagge, aber ich weiß nicht, wie sonst, das zu tun. Ich nehme ich es mit einem descendant_is_leaf ersetzen könnte Terminal Elemente zu identifizieren ...

Die Sortierreihenfolge durch eine Tabelle dargestellt wird, die in einer Tiefe von 1 alle Beziehungen umfasst:

Depth=1 table 
recipe_id step_id  order 
3   2   1 
4   3   1 
6   4   1 
2   3   1 
2   6   2 

Ich vereinfacht hier, weil ich in der Praxis Zutaten und Anweisungen trennen würde, aber Sie bekommen die Idee.

Also, ist das ein guter Weg, um sowohl eine hierarchische Datenstruktur als auch eine Vorstellung von Schrittfolge zu kombinieren? Alles, was ich tun sollte, um zu verbessern/zu vereinfachen?

Antwort

0

Also habe ich ein paar Nachforschungen über mein Problem angestellt, wobei ich hauptsächlich die hier und anderswo von Bill Karwin bereitgestellten Informationen nutze (ich entschied mich schließlich, sein Buch zu kaufen). Basierend darauf denke ich, dass die beste Option darin besteht, eine Breadcrumbs-Spalte zu meiner Verschlusstabelle hinzuzufügen, ähnlich wie es Bill hier empfiehlt MySQL Closure Table hierarchical database - How to pull information out in the correct order.

Die Paniermehl erlauben mir ORDER BY, die mein Bestellproblem lösen würde.

Ich würde die Terminal-Knoten finden, indem Sie die Schließungstabelle abfragen und nach allen Knoten suchen, die keinen Vorgänger außer sich haben.

0

Ich bin vielleicht weg hier, aber Rezept und Anweisung könnten die gleiche Tabelle sein, die Ihre Beziehungen vereinfacht.

Anweisung: id, name, is_recipe

Schritte: parent_id, child_id, um

nun ein Rezept kann Anweisungen und Rezepte als Kinder haben. Eine Anweisung könnte sogar sein, ein Rezept zu folgen, aber mit reduziertem Butter ...

Sie müssen möglicherweise aber ...

8

Ein Rezept eine Schleife-Steuerung hinzuzufügen, ist eine sequentielle Reihe von Anweisungen oder andere Rezepte .

Je nachdem, wie man diesen Satz gelesen hat, kann dies mehrdeutig sein.

Wie wäre:

Ein Rezept ist eine sequentielle Reihe von Anweisungen.

Eine Anweisung ist entweder einfach (ein Blatt) oder komplex (verwendet ein anderes Rezept).

Welche gibt:

Table recipe: 
- column id 
- column name 
- column total_cost, total_preparation_time, etc 

Table instruction: 
- column id 
- column recipe_id 
- column step_order 
- column description 
- column child_recipe_id (can be NULL) 

Also, wenn die Pfirsichtarte verwendet Teig und Pfirsich erhalten:

select * from recipe order by id; 
id  name 
1  Dough 
2  Peach preserve 
3  Peach tart 

select * from instruction order by recipe_id, step_order; 
id recipe_id step_order description  child_recipe_id 

100  1  1  Get flour  NULL 
101  1  2  Add water  NULL 
102  1  3  Mix together NULL 

201  2  1  Peel peaches NULL 
202  2  2  Cube peaches NULL 
203  2  3  Add sugar  NULL 
204  2  4  Cook together NULL 

301  3  1  Pre heat oven NULL 
302  3  2  Prepare dough 1 
303  3  3  Prepare peach 2 
304  3  4  Bake   NULL 

Es gibt keine Flags "Blatt ist".

Eine Anweisung ist ein Blatt, wenn sie nicht auf ein untergeordnetes Rezept zeigt, d. H. Child_recipe_id ist NULL.

+0

In diesem Sinne sind die Felder 'description' /' name' redundant in Bezug aufeinander. Wie wäre es, wenn ein Tisch den Baum der Rezepte und der andere nur die Namen hätte? – Yuval

+0

@Yuval, ich sehe den Rezeptnamen und die Anweisungsbeschreibung nicht, die das Rezept als redundant verwendet. Das erstere beschreibt "was" der resultierende Inhaltsstoff ist (zum Beispiel "geschmolzene Schokolade"), das spätere "Wie" wird das Ergebnis verwendet (z. B. "Kunst auf Teller mit geschmolzener Schokolade"). Yumm. –

Verwandte Themen