Несколько деревьев с иерархическими данными (значения слева и справа) - PullRequest
1 голос
/ 24 июня 2011

Какие проблемы связаны с поддержанием нескольких Tress в одной таблице?

Мотивация наличия нескольких деревьев состоит в том, чтобы избежать чрезмерного обновления всех узлов при вставке узла в начале. Каждое из деревьев - это совершенно разные сущности.

Пример таблицы:

tree_id  | id  | lft | rgt | parent_id |   various fields . . .
---------------------------------------------------------------------
1        |  1  |  1  |  4  |   NULL    |   ...
1        |  2  |  2  |  3  |    1      |   ...
2        |  3  |  1  |  4  |   NULL    |   ...
2        |  4  |  2  |  3  |    3      |   ...

1 Ответ

1 голос
/ 24 июня 2011

Очень часто хранить несколько деревьев в одной таблице, просто нужно убедиться, что значения, которые составляют дерево, хранятся правильно, иначе это приведет к проблемам целостности данных, таким как бессмысленные построения дерева.

Предположим, у нас есть двоичное дерево (как в вашем примере). Если бы дерево было 5 глубиной. ((2 ^ n) -1) = (2 ^ 5 - 1) узлов будет существовать или 31 строка в базе данных, что тривиально. Даже на 10 глубинах это все еще небольшое количество рядов, но это будет довольно гигантское дерево. И поэтому, имея несколько деревьев X, в базе данных будет X ((2 ^ n) -1) = строк ... что неплохо. Таким образом, потенциально одна сотня деревьев может существовать в одной таблице и будет содержать только 100 000 строк, что относительно мало.

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

Если рассматривать вашу таблицу подробно, она не совсем выглядит с точки зрения столбцов, но я уверен, что пример таблицы - это просто что-то очень быстрое, чтобы показать нам, что вы имеете в виду.

tree_id, node_id, left_node_id, right_node_id, various_fields...

Хм, не забудьте проиндексировать эти поля _id.

...