2013-05-22 5 views
0

В моем приложении есть users. У каждого пользователя может быть много друзей (других пользователей). Если пользователь A имеет друга B, тогда пользователь B имеет друга A - всегда. Мне придется запросить коллекцию пользователей, чтобы, например, получить всех друзей пользователя A. И мне придется также использовать геопространственный индекс для этого запроса, чтобы получить всех друзей пользователя A в данном радиусе от пользователя A.Как смоделировать recurency и hasMany отношения в MongoDB?

У меня есть некоторые проблемы при попытке «моделировать» эту структуру в MongoDB. Теперь у меня есть это (в Мангусте):

{ 
    created: { type: Date, default: Date.now }, 
    phone_number: { type: String, unique: true }, 
    location: { type: [Number], index: '2dsphere' }, 
    friends: [{ phone_number: String }] 
} 

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

Что будет лучшим вариантом моделирования этой структуры?

ответ

2

два подхода:

Регистрация Коллекция

Подобный подход, при котором соотношение есть коллекция, которая имеет документы, представляющие приятельств (в основном, два объекта идентификаторами и возможные мета-данные об отношениях).

Массивы на каждого пользователя

Создание массива и раздвинуть объект корочки друзей на массив.

Когда создается дружба, вам нужно будет изменить обоих друзей (нажимайте каждого друга на другой массив друзей). Это было бы одинаково для роспуска дружбы.

Какой?

Подход к сбору данных работает медленнее, так как для получения данных дружбы требуется несколько запросов, а не для того, чтобы они сохранялись с самим пользователем (с учетом локальности данных). Однако, если число отношений растет неограниченным образом, подход массива невозможен. Документы MongoDB имеют ограничение в 16 Мбайт, и существует практическая верхняя граница порядка 1000 или около того, после чего работа с массивами становится медленной и громоздкой.

+0

Хм, если я предположим, что у каждого пользователя может быть до 1000 друзей, тогда я лучше использую Массивы для каждого пользователя? – user606521

+0

Но формат массивов имеет ошибку, что вы не можете хранить дополнительную информацию о дружбе. Это может быть проблемой. –

+0

Не совсем, вы всегда можете хранить объекты (встроенные документы) в массиве, содержащем метаданные дружбы. –