У меня есть база данных 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 полями, сглаженными в каждой, без возможности индексирования.
Каков правильный подход?