Это продолжение моих вопросов здесь:
Как реализовать иерархическую структуру "многие ко многим" в MySQL
и здесь:
Как записывать последовательные наборы записей в MySQL.
Короче говоря, я хочу реализовать в MySQL таблицу рецептов и еще одну таблицу инструкций. Рецепт — это последовательный ряд инструкций или других рецептов.Так, например, вы можете представить рецепт Peach_preserve
и Peach_tart
, в котором используется Peach_preserve
, а также ряд других шагов (инструкций). Peach_preserve
можно использовать для многих других рецептов.
Я прочитал эту запись в блоге Билла Карвина о замыкающих таблицахи думаю, что это решение лучше всего решает мои проблемы (моя иерархия — «многие ко многим», а шаги — последовательные). Так, например, у меня было бы:
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...)
Я не поклонник флага потомок_is_instruction
, но я не знаю, как еще это сделать. Я полагаю, что мог бы заменить его на потомок_это_лист
, чтобы идентифицировать конечные элементы...
Порядок сортировки представлен таблицей, которая включает все отношения на глубине 1:
Depth=1 table
recipe_id step_id order
3 2 1
4 3 1
6 4 1
2 3 1
2 6 2
Я упрощаю здесь, потому что на практике я бы разделил ингредиенты и инструкции, но вы поняли идею.
Итак, это хороший способ объединить иерархическую структуру данных и понятие пошагового порядка? Что я должен сделать, чтобы улучшить/упростить?