2017-02-22 71 views
0

Я думал, проще всего было бы плоский список:Каков наиболее эффективный способ хранения структуры данных дерева в MongoDB?

{ 
    id: ObjectId() 
    parentId: ObjectId() 
    value: ‘foo’, 
} 

Только одна большая коллекция. Чтобы найти дочерние узлы узла, просто выполните поиск по списку и найдите все экземпляры, где parentId равен текущему идентификатору узла. Индексы на id/parentId.

Это может быть быстрее для записи, но чтение может стать довольно ужасным. И у нас будет намного больше чтений, чем пишет!

MongoDB есть своего рода встроенный в структуру данных дерева: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

Но мне интересно, как это отличается от плоского списка, как тот, который я предложил.

ответ

1

Если вы определяете индекс на id и индекс на parentId, найдите детей узла, которые должны быть очень быстрыми.

Почему, на ваш взгляд, это ужасно?


UPDATE: В худшем случае будет O(log N), но важно отметить, что размер ведра Монго использует 8192 (source). Это означает, что на этот раз действительно небольшое постоянное умножение, что означает, что операции MongoDB могут быть довольно быстрыми.

+0

Это было бы не так уж плохо. Но каждый раз, когда вам нужно было найти детей узла, вам нужно было бы посмотреть одну и ту же коллекцию и перечитать ее. Худший случай, я думаю, это log (n) время, чтобы прочитать целую вещь с индексом на ней. –

+1

@AlexanderMills да, но они очень быстрые из-за размера ведер. Я обновил свой ответ. – Lucas