дизайн таблицы для древовидных данных - PullRequest
1 голос
/ 16 ноября 2011

При использовании других реляционных баз данных таблица выглядит следующим образом:

ID        Name         ParentID
1         root          NULL
2         a              1
3         b              1
4         aa             2
5         aaa            4

при использовании mongo db будет проще, если мы создадим документ следующим образом:

{
   ID : 1,
   Name : "root",
   Children : [
      {
         ID : 2
         Name : "a",
         Children : [ ... ]
      },
      {
         ID : 3
         Name : "b",
         Children : [ ... ]
      }
   ]
}

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

1 Ответ

2 голосов
/ 16 ноября 2011

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

db.items.update({_id: 1, Children.ID: 2 }, {Children.$.Name: "b"},false,false);

Нодля уровня вложенности = 2 вы не можете сделать это, потому что позиционный оператор не поддерживает его сейчас (но я думаю, что это произойдет в будущем).

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

Существует другой подход к схеме, позволяющий избежать этого:

{
   _id : 1,
   Name : "root",
   ParentId: null
},
{
   _id : 2,
   Name : "nested",
   ParentId: 1
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...