Подтвердить что ты не робот

Как сохранить дерево в базе данных SQL

Мне нужно сохранить дерево в базе данных, так что лучший способ сделать это? Покажите метод, который вы используете, и укажите его плюсы и минусы. (Я использую SQL Server 2005)

4b9b3361

Ответ 1

Я нашел обсуждение в SQL Anti-patterns очень полезным, так как он также фокусируется на недостатках каждой реализации.

Кроме того, слайды 48-77 в этой презентации повторяют, что analisys.

В нижней строке нет такой вещи, как родовое дерево, и никакой серебряной пули для деревьев SQL. Вам нужно будет спросить себя о данных, о том, как и сколько они будут выбраны, изменены, будут перемещены ветки и т.д., И на основе этих ответов будет реализовано подходящее решение.

Ответ 3

Ну, проще всего было бы записать запись столбца ParentID, чтобы он знал, какая запись является его родительской. Это довольно стандартная практика. Например, интернет-магазин может иметь иерархию категорий товаров. Каждая категория будет иметь ParentID. Пример. В категории "Джинсы" в базе данных одежды может быть "Штаны" в качестве родительской категории. Это немного сложнее, если вы хотите, чтобы запись указывала, кто ее дети, если вы не ограничиваете количество детей. Если вы хотите двоичное дерево, вы можете иметь столбцы LeftChildID и RightChildID. Если вы разрешаете любое количество детей, у вас может быть столбец "Дети" с идентификаторами, разделенными запятыми (например, 1,4,72,19), но это сделает запрос довольно сложным. Если ваша база данных позволяет использовать типы массивов в столбцах, возможно, вы можете использовать массив вместо строки с разделителями, что было бы легко запросить, но я не уверен, поддерживает ли MS SQL Server это или нет.

Кроме этого, это зависит от того, какие данные вы моделируете, а также о том, какие операции вы планируете делать с этим деревом.

Ответ 5

Существует два общих подхода

  • В каждой записи сохраните идентификатор родителя в столбце с нулевым значением (корень дерева не имеет родителя)
  • Использовать метод модели вложенных наборов Joe Celko, объясненный здесь и (спасибо комментарию от @onedaywhen), также в том, что является исходным источником здесь

EDIT: новая ссылка для этого материала здесь.

Плюсы и минусы??!! вы шутите, верно?!

Ответ 6

Я делал это в прошлом, сохраняя данные как xml в SQL.