2015-06-13 2 views
0

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

User Schema :- 
var UserSchema = new Schema({ 
Name: { 
    type: String , 
    required: true 
}, 
Clubs: [ 
    {type: mongoose.Schema.Types.ObjectId, ref: 'Club'} 
]}); 

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

var ClubSchema = new Schema({ 
clubName : { 
    type: String , 
    unique: true , 
    required: true 
}, 
members : [ 
{type: mongoose.Schema.Types.ObjectId, 
    ref: 'User' , 
    default: [] 
} ]}); 

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

ответ

1

Трудно сказать, что такое «правильный путь», если честно, поскольку это, скорее всего, случайный случай в зависимости от ваших запросов приложений и архитектуры.

Я видел, как некоторые люди делают то, что вы создали выше; Решаем отношения «многие ко многим», используя ссылку в обеих коллекциях. Это будет работать для ваших конкретных запросов выше:

db.user.find ({ "клубов": ObjectId ("000000")}); # Найдите всех пользователей, принадлежащих определенному клубу. db.club.find ({"users": ObjectId ("111111")}); # Найдите все клубы, к которым принадлежит пользователь.

С двух индексов на:

db.user.ensureIndex ({ "клубы": 1});

db.club.ensureIndex ({"users": 1});

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

Если вы считаете, что консистенция, упомянутая выше, является нарушителем сделки, , то перейдите со ссылкой только на ссылки клубов в коллекции пользователей. Это, вероятно, самый распространенный дизайн, и тот, который указан на официальном сайте mongodb в .

http://docs.mongodb.org/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

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

Надеюсь, что это поможет.

+0

Спасибо за предложение. Я перейду со вторым вариантом и изменю его, если запрос на выборку станет узким местом. –

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