2013-09-09 6 views
0

Мне интересно, какой был бы лучший способ хранить данные, например, заказы в ресторане, в моем mongoDB.Дизайн схемы MongoDB - огромный список

Итак, сначала мне понадобится коллекция «Заказы».

также потребуется сделать много чтения для синхронизации данных между официантами, поэтому я не хочу хранить заказы, которые завершены (оплачены), и заказы, которые все еще открыты в том же списке.

Итак, я придумал коллекцию «Заказы», ​​которая имеет 2 поля массива: «текущий» и «история». В текущем состоянии я бы сохранил все заказы, которые все еще не оплачены (необходимо синхронизировать всех официантов), а в «истории» я бы сохранил все, что было закрыто, и к ним должны обращаться только менеджеры или кто-то, кто хочет просмотреть данные.

Таким образом, я могу свести к минимуму время доступа и отправку данных.

Будет ли это правильным, наилучшим способом для этого?

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

EDIT:

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

ответ

2

Поскольку коллекция заказов представляет собой один ресторан бы не вместо содержать записи всех заказов, при этом каждый документ выглядит как:

{ 
    _id:{} 
    waiter: 'Sammaye', 
    table: 9, 
    items: [ 
     {id:9,qty:1,cooked:false} 
    ], 
    billed: false 
} 

И все официанты, которые нужно знать о заказах ждет, чтобы выйти просто получить все документы заказа из этой коллекции, которые имеют billedfalse ,

Это должно быть достаточно хорошо, если вы поместите индекс на billed.

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

Использование в операциях памяти ($push, $pull и т. Д.) Могло бы замедлить работу документа.

Он также может создавать фрагментацию в базе данных, так как это несвязанные массивы, постоянно растущие со временем, что также снижает производительность.

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

+0

в этой коллекции я бы заказывал несколько ресторанов, а не только один ресторан. Так что это не было бы проблемой, если бы я со временем, например, 10 000 заказов в одной коллекции, и получить те, у кого нет но я заплатил, что мне пришлось бы сканировать на основе выставленных счетов и ресторанов. Я мог бы использовать составной индекс здесь, будет ли это все в порядке относительно производительности? – deloki

+1

@deloki Да, это должно быть довольно быстро, и индекс должен быть довольно легким, это всего лишь 2 поля – Sammaye