Нет эффективного способа представления иерархических отношений в реляционном хранилище. Хранилища ключей-значений (вы, возможно, слышали о них, они все в моде в наши дни) лучше в этом, но, как правило, не предоставляют уровни SQL. Получение всех блоков по определенному пути потребует более одного запроса, если вы хотите иметь возможность перемещать сегменты (если вы не хотите перемещать сегменты когда-либо, вы можете использовать схему, которая у вас есть) и выполните поиск подстроки по имени сегмента для таких вещей, как "a/*"
).
Тем не менее, вы можете сделать это даже без того, чтобы каждое ведро сохраняло свой собственный полный путь: вам нужно отображение отношений «многие к себе» для многих из многих от bucket
до bucket
. Вам нужны две таблицы, одна для сегментов и одна только для отображения. В таблице сопоставления у вас есть два столбца, parent_bucket
и child_bucket
. В таблице bucket
есть три: bucket_id
, key
и value
.