Как создать фид файлов из людей, за которыми следит пользователь? - PullRequest
0 голосов
/ 17 ноября 2011

Я создаю API, используя PHP и MongoDB.В этой системе у меня есть пользователи, и каждый пользователь может загружать файлы.Пользователи также могут «следовать» друг за другом.

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

Это то, что я собираюсь реализовать.

  1. Получить всех пользователей, за которыми следит пользователь.
  2. Перебрать этот массив пользователей и получить последние 4 файла для каждого пользователя и добавить их в массив.
  3. Каким-то образом упорядочить эти файлы (этот массив) по дате создания.
  4. Вернуть его.

Это действительно оптимальный путь?Есть ли способ лучше?Пользователи сохраняются в коллекции Пользователи и файлы в файлах коллекции.Следующее сохраняется в коллекции users.followers.

1 Ответ

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

Это проблема разветвления и разветвления. Я бы посоветовал вам попробовать разойтись:

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

{
    "_id": (some id)
    "UserId": (id of the user who 'owns', i.e. reads this feed)
    "FriendId": (if of the friend who posted the file)
    "FriendName": "John Doe" (name of the fried, denormalized)
    "Timestamp": ...
}

Использовать составной индекс {UserId, Timestamp}.

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

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

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