2016-12-09 4 views
0

Я проектирую социальную сетевую систему, такую ​​как твиттер, и пользователи получат уведомления, я собираюсь сохранять уведомления в mongodb. Мы будем поддерживать 100 уведомлений для каждого пользователя максимум, и единственным полем будет обновление read (пользователь прочитал уведомление). Поэтому мне интересно, кастрированный баран с помощью несколько документов, как ударМногосторонний документ или встроенный документ в Mongodb?

{"userId":1, "content":"some msg", "read":true..} 
{"userId":1, "content":"another msg", "read":true..} 

или с помощью встроенных документов, как это:

{"userId":1, "noficications":[{"content":"some msg", "read": true},{"content":"another msg", "read":true}]} 

ответ

0

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

Если ваш фокус - «Пользователь», я не вижу проблем в вашем втором подходе, но если фокус «Уведомления», я бы рекомендовал создать документ для сохранения ваших уведомлений.

0

Это полностью зависит от вашего использования. Если вы всегда загружаете большинство/все уведомления для данного пользователя, я бы сохранил его в одном документе с массивом уведомлений. Это позволит отображать весь документ в памяти и будет держать все в порядке. Также вам не придется создавать дополнительные индексы.

{"_id":1 /* User Id */, "noficications":[{"content":"some msg", "read": true},{"content":"another msg", "read":true}]} 

Однако, если вы собираетесь быть отходили ADHOC индивидуального уведомления, я бы разделить его вниз, чтобы отдельные документы, так как вы не хотите, чтобы держать весь документ горячим в памяти. для этого apporach вы можете создать еще один индекс в «userId», чтобы сразу отменить все уведомления.

{"_id": 1 /* Notification Id */, "userId":1, "content":"some msg", "read":true..} 
{"_id": 2 /* Notification Id */, "userId":1, "content":"another msg", "read":true..} 

У обоих есть плюсы и минусы, и все зависит от использования данных.

+0

Я хотел использовать встроенный массив, но немного волновался за производительность. Как упоминалось в этих статьях: [1] (https://groups.google.com/forum/#!topic/mongodb-user/8R0UwurbbyE), [2] (http://www.askasya.com/post/largeembeddedarrays/), производительность может быть проблемой. Что, если размер массива равен 100? Это вызовет проблемы с производительностью? – Collin

+0

Если ваше ограничение количества элементов возвращается клиенту для каждого запроса, то отдельные документы будут более эффективными, так как массив займет больше рабочего пространства, и вам также нужно будет получить мангу, чтобы нарезать его –

+0

Но если вы используете отдельные документы, трудно ограничить количество документов пользователей определенным числом. В этом случае я должен настроить программу планирования и перебрать все документы, которые будут неэффективными, не так ли? – Collin

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

  • Нет связанных вопросов^_^