Пример моей древовидной таблицы: ([id] - это личность)
[id], [parent_id], [path]
1, NULL, 1
2, 1, 1-2
3, 1, 1-3
4, 3, 1-3-4
Моя цель состоит в том, чтобы быстро запросить несколько строк в этой таблице и просмотреть полный путь узла от его корня до его старших элементов и до самого себя. Главный вопрос заключается в том, должен ли я сгенерировать этот путь для вставок и сохранить его в отдельном столбце или сгенерировать этот путь в запросе для экономии места на диске? Я думаю, это зависит от того, будет ли эта таблица тяжелой или тяжелой.
Я обдумывал несколько подходов к использованию характеристики «пути» в этих отношениях родитель / ребенок, и я просто не могу остановиться на одном. Этот «путь» просто для демонстрации и не служит абсолютно никакой другой цели. Вот что я сделал для реализации этого «пути».
- ПОСЛЕ INSERT TRIGGER - требуется передать NULL-путь к вставке и обновить путь для записи с идентификатором вставленных строк
- INSTEAD OF INSERT TRIGGER - не требует, чтобы вставка передавала путь NULL, но требует триггера для вставки с путем NULL и обновления пути для записи в SCOPE_IDENTITY ()
- ХРАНЕННАЯ ПРОЦЕДУРА - требуется, чтобы все вставки в эту таблицу выполнялись с помощью хранимой процедуры, реализующей логику триггера
- VIEW - требуется построить путь в представлении
1 и 2 кажутся раздражающими, если одновременно вводится большое количество данных.
3 кажется раздражающим, потому что все вставки должны пройти процедуру, чтобы заполнить действительный путь.
1, 2 и 3 требуют ведения столбца пути в таблице.
4 снимает все ограничения, описанные выше, но требует, чтобы представление выполняло логику пути, и требует использования представления для отображения пути.
Я успешно реализовал все вышеперечисленные подходы и в основном ищу несколько советов. Я далеко от цели или приемлемо ли что-либо из вышеперечисленного? У каждого есть свои преимущества и недостатки.