3

У меня есть база данных MongoDB полукомпозитных записей, и мои запросы к отчетности борется с увеличением размера коллекции. Я хочу сделать некоторые отчеты Views, оптимизированные для быстрого поиска и агрегирования. Вот пример формат:Производительность структуры сборки MongoDB

var record = { 
fieldOne:"", 
fieldTwo:"", 
fieldThree:"", //There is approx 30 fields at this level 
ArrayOne:[ 
    {subItem1:""}, 
    {subItem2:""} // There are usually about 10-15 items in this array 
], 
ArrayTwo:[ 
    {subItem1:""}, //ArrayTwo items reference ArrayOne item ids for ref 
    {subItem2:""} // There are usually about 20-30 items in this array 
], 
ArrayThree:[ 
    {subItem1:""},// ArrayThree items reference both ArrayOne and ArrayTwo items for ref 
    {subItem2:""},// There are usually about 200-300 items in this array 
    {subArray:[ 
     {subItem1:""}, 
     {subItem2:""} // There are usually about 5 items in this array 
    ]} 
] 
}; 

Я использовал, чтобы иметь эти данные, где ArrayTwo находившиеся ArrayOne пунктов и ArrayThree находившихся ArrayTwo элементов, так что ссылки на родительском подразумевались, но отчетность превратился в кошмаре с несколькими вложенных уровнями массивов ,

У меня есть поле под названием 'fieldName' на каждом уровне, который является способом, которым мы нацеливаем объекты в массивах.

Мне часто нужно собирать значения из любого из трех массивов в тысячах записей в запросе.

Я вижу два способа сделать это.

A). Сгладьте и идите по вертикали, сделав единственную меньшую запись в базе данных для каждого элемента в ArrayThree, по существу добавляя 200 записей на одну сложную запись. Я попробовал это, и у меня уже есть записи 200K за 5 дней после ввода новых данных. Преимущество этого в том, что у меня есть имена полей, на которые я могу поместить индексирование.

B). Сгладьте по горизонтали, делая каждый массив плоским в пределах одной записи коллекции. Я бы использовал поле FieldName, расположенное в каждом объекте массива, как key. Это сделало бы одну запись с 200-300 полями в ней. Это сделало бы намного меньше записей в коллекции, но поля были бы динамическими, поэтому добавление индексов было бы невозможным (что я знаю).

В настоящее время у меня около 300 тыс. Существующих записей, которые я бы построил для этого вида. Если я поеду вертикально, это займет 60 миллионов простых записей в db, и если я поеду по горизонтали, это будет 300K записей с 200 полями, сглаженными в каждой, без возможности индексирования.

Каков правильный подход?

ответ

0

Я был бы склонен придерживаться философии монго и делать отдельные записи для каждого отдельного набора/части информации, а не полагаться на ссылки внутри странного составного объекта.

60 миллионов записей «много» (но это действительно не «тонна»), и монгод любит любить много мелочей. На оборотной стороне вы получите меньше крупных объектов и занимаете столько же места.

(* используя проводной задний конец тигра с компрессией, ваш диск также будет двигаться дальше).

** Редактировать: Я бы также добавил, что вы действительно действительно хотите индексы в конце дня, так что это еще один голос за такой подход.

Смежные вопросы