Как сохранить дерево в базе данных SQL - PullRequest
18 голосов
/ 09 июля 2010

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

Ответы [ 4 ]

14 голосов
/ 09 июля 2010

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

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

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

7 голосов
/ 09 июля 2010
4 голосов
/ 09 июля 2010

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

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

1 голос
/ 09 июля 2010

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

...