2016-11-27 1 views
0

Я строю простую систему личных сообщений для большого сайта nosql, и я думаю о дизайне стола. Количество чтений, вероятно, равно (или вдвое) количеству записей, но для чтения нужны все (последние) сообщения.Как создать простую, но масштабируемую систему личных сообщений (nosql)?

  • Моя первая мысль была сделать таблицу threads (столбцы: ThreadId, user1, user2), и таблица messages (столбцы: MESSAGEID, ThreadId, MessageText). Однако некоторые симуляции показывают, что индекс messages не поместится в ОЗУ.
  • Моя следующая мысль заключалась в том, чтобы сделать только одну таблицу threads (столбцы: user1, user2, contents) и обновить столбец contents каждый раз, когда кто-то отвечает в разговоре (используя $push на массиве). Это медленнее, чем вставка, тем более, что длина этого текстового поля растет при каждом ответе.

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

ответ

1

Почему бы вам не использовать комбинацию обоих способов? в основном u необходимо прочитать последние сообщений и сделать не нужно отдохнуть!

Поэтому я бы предложил создать все эти 3 таблицы (например, recent, threads, messages, который в последнее время основан на вашем втором подходе)!

Последние 50 последних сообщений в recent! и если у вас более 20 сообщений, удалите старые из recent и поместите их в threads и messages.

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

+0

Блестящий, спасибо! Основываясь на этом предположении, я думаю, что я буду использовать следующий вариант: таблицу 'recent_posts', которая будет использоваться как в методе 1, таблица' threads' для использования, как в методе 2, и каждые 24 часа (ночью) я очищаю recent_posts и добавьте их в поля накопления в таблице протектора. – user1111929