MongoDB Дизайн таблиц и выполнение запросов - PullRequest
2 голосов
/ 22 ноября 2011

Я новичок в MongoDB.При создании новой таблицы у меня возник вопрос, связанный с ее дизайном и производительностью.Моя структура таблицы выглядит следующим образом:

{
    "name" : string,
    "data" : { "data1" : "xxx", "data2" : "yyy", "data3" : "zzz", .... }           
}

Поле «данные» может увеличиваться, пока не достигнет количества в 100 000 элементов («data100.000»: «aaaXXX»).Однако количество строк в этой таблице будет контролироваться (от 500 до 1000).

В моей таблице будет многократный доступ к этой таблице, и я хотел бы максимизировать производительность любых запросов.Я бы делал запросы, подобные этому (я приведу пример в java):

new Query().addCriteria(Criteria.where("name").is(name).and("data.data3").is("zzz"));

Я не знаю, будет ли это медленнее, когда количество элементов «dataX» ... будет расти.

Итак, вопрос в том, верен ли этот дизайн?Должен ли я что-то изменить?

Я буду рад прочитать ваш совет, большое спасибо заранее

Ответы [ 2 ]

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

Документ можно просматривать как таблицу со столбцами, но вы должны быть осторожны. У него есть другие характеристики использования. Размер документа может быть макс. 16 МБ. И имейте в виду, что документы хранятся в памяти монго.

По вашему запросу будет возвращен весь документ. Спросите себя, нужны ли вам все записи или вам придется использовать одну запись самостоятельно?

Это должно быть хорошим началом.

0 голосов
/ 23 ноября 2011

Что такое данные?Я бы не стал хранить один вложенный документ, содержащий до 100 000 полей, так как вы не сможете легко проиндексировать его, что приведет к проблемам с производительностью.

Лучше хранить в виде массивастрок, то вы можете индексировать поле массива, которое будет индексировать все значения.

{
    "name" : string,
    "data" : [ "xxx", "yyy", "zzz" ]
}

Если, как и в вашем запросе, вы хотели получить значение в определенной позиции в массиве, а не data.data3, вы могли быdo:

db.Collection.find( { "data.2" : "zzz" } )

Или, если вы не заботитесь о позиции и просто хотите, чтобы все документы, где массив данных содержал 'zzz', вы можете сделать:

db.Collection.find( { "data" : "zzz" } )

100 000 строкне собирается получать около 16 МБ, так что вам не нужно об этом беспокоиться, но наличие 100 000 полей во вложенном документе или массиве указывает на то, что с дизайном что-то не так, но я не могу точно сказать, что это за данные..

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