Si tratta di un follow-up alle mie domande qui:
How to implement a many-to-many hierarchical structure in MySQL
e qui:
How to record sequential collections of records in MySQL.Come aggiungere un ordinamento a una tabella di chiusura MySQL che rappresenta una relazione molti-a-molti?
In breve, voglio implementare in MySQL una tabella di ricette e un'altra di istruzioni. Una ricetta è una serie sequenziale di istruzioni o altre ricette. Quindi, ad esempio, puoi immaginare una ricetta Peach_preserve
e una Peach_tart
che utilizza lo Peach_preserve
, più una serie di altri passaggi (istruzioni). Peach_preserve
potrebbe essere utilizzato per molte altre ricette.
Ho letto this blog post by Bill Karwin about closure tables e ritengo che questa soluzione risolva al meglio le mie sfide (la mia gerarchia è molti-a-molti e i passaggi sono sequenziali). Così, per esempio avrei:
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...)
io non sono un fan della bandiera descendant_is_instruction
, ma io non so come altro fare questo. Suppongo che potrei sostituirlo con un descendant_is_leaf
per identificare gli elementi terminali ...
L'ordinamento è rappresentato da una tabella che incorpora tutte le relazioni ad una profondità di 1:
Depth=1 table
recipe_id step_id order
3 2 1
4 3 1
6 4 1
2 3 1
2 6 2
sto semplificando qui perché in pratica separerei gli ingredienti e le istruzioni, ma tu hai l'idea.
Quindi, è un buon modo per combinare sia una struttura gerarchica dei dati che una nozione di ordine dei passi? Qualunque cosa dovrei fare per migliorare/semplificare?
In questo senso, i campi 'description' /' name' sono ridondanti l'uno rispetto all'altro. Che ne dici di avere un tavolo con l'albero delle ricette e l'altro solo i nomi? – Yuval
@Yuval, non vedo il nome della ricetta e la descrizione dell'istruzione che utilizza la ricetta come ridondante. Il primo descrive "cosa" l'ingrediente risultante è (ad esempio, "cioccolato fuso"), il "come" viene utilizzato il risultato (ad esempio, "disegna l'arte nel piatto con il cioccolato fuso"). Yumm. –