Постараюсь выставить как можно более ясно;)DB Design: лучшие практики в иерархическую структуру
Ну, я не нужно хранить некоторые данные, которые могут быть linket себя в качестве родителя> ребенка отношений с не -пределить глубину.
Моя первая попытка была:
entry_id | parent_id | value
1 | NULL | Foo //foo is the grand parent
2 | 1 | Bar //bar is child of Foo
3 | 1 | Baz //baz too
4 | 2 | Bho //bho is child of Bar
5 | 4 | Som //som is child of Bho
6 | NULL | Git //another grand parent
7 | 6 | Tim //Git's child
..и так далее.
Эта структура работает, но ее невозможно (или, по крайней мере, я не мог пройти) найти все дети Foo и «дочерние» с одним запросом .. для этого нужен цикл.
Моя цель состоит в том, что структура оптимизирована для запроса на выборку, что может дать мне все отношения в одном кадре, что-то вроде:
SELECT "ALL SONS OF Bar"
выход:
entry_id | parent_id | value
1 | NULL | Bar
4 | 2 | Bho
5 | 4 | Som
но эта структура оленья кожа похоже, позволил мне сделать это.
Любая идея?
Если может иметь значение, я буду работать на Postgresql (я думал использовать массив типа полей, но запрос обыкновение быть очень быстро)
Редактировать для комментариев Филиппу: в моем конкретно, данные не должны слишком часто меняются, но мне, вероятно, придется использовать эту структуру для других задач, похожих на нее, но не равных - где данные могут обновляться много раз.
В качестве примечания, используя внешние ключи (или аналогичное поведение) будет лучше (удаление одного «отца» следует удалить все Чайлдс - нет детей-сирот не допускается)
Как часто будут изменяться данные и как они будут меняться (добавьте листы, обменивайте ветви, удалите узлы из середины/свяжитесь с сиротами и т. Д. И т. Д.). Упрощенные системы могут содержать ярлыки, но если вам нужна серьезная гибкость, все может стать сложным. –
Значение 0 неверно, нет значения entry_id с этим значением: любое ограничение внешнего ключа завершится с ошибкой. Используйте NULL, если у вас нет родителя. –
@frank: вы правы. – Strae