2015-03-18 3 views
0

У меня есть следующий случай: Пользователь может добавлять контакты (кто других пользователей) на веб-сайт. При желании пользователь может также организовывать свои контакты в группах. Пользователь может иметь много писем, адресов и телефонов.Лучшие способы моделирования этой простой схемы (MongoDB)?

Я думал о следующем проекте схемы (хранилище документов/mongodb). Есть ли способы улучшить это? Моя основная проблема заключается в том, что изображение профиля встроено внутри документа. Я знаю, что это не очень хорошая практика, но для этой цели (назначения) мне тоже нужно вставить картинку (blob/gridfs). Но мне интересно, как можно улучшить эту схему.

+0

Как вы собираетесь использовать документ? Какие запросы вы будете запускать? Какие обновления? – wdberkeley

+0

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

ответ

0

Для пользователей, я думаю, что ваша текущая схема в порядке. Сохранение нескольких адресов, телефонных номеров и адресов электронной почты в массивах является хорошим, потому что их не должно быть слишком много для определенного человека, и легко запросить «у кого есть этот адрес электронной почты» или «дать мне все номера телефонов этот человек". У вас, похоже, есть избыточное поле e-mail, хотя это специальный адрес электронной почты, например адрес для учетной записи, который отличается от контактного электронного письма? Если это так, я бы назвал это описательным именем для других сопровождающих, такое имя, как account_email. Я бы не стал фотографировать как blob, но вы сказали, что это другое требование, поэтому я не буду критиковать его.

Мне нравится идея делать контакты с группами, используя отдельную коллекцию контактов. Я бы иметь contacts коллекцию каждый документ, представляющий собой один контакт индекс

{ 
    "_id" : ObjectId("..."), 
    "owner_id" : ObjectId("..."), // reference to user document of contact owner 
    "contact_id" : ObjectId("..."), // reference to user document of contact 
    "group" : "Rivals" // group name 
} 

на { "owner_id" : 1, "contact_id" : 1 } и, возможно, { "owner_id" : 1, "group" : 1 }, а затем запросы, подобные следующим будет быстро:

// get all contacts for user x 
db.contacts.find({ "owner_id" : x }) 
// is user y a contact of user x? 
db.contacts.count({ "owner_id" : x, "contact_id" : y }) != 0 
// get all contacts in group "family" for user x 
db.contacts.find({ "owner_id" : x, "group" : "family" }) 

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

{ 
    "_id" : ObjectId("..."), 
    "owner_id" : ObjectId("..."), // reference to user document of contact owner 
    "contact_id" : ObjectId("..."), // reference to user document of contact 
    "group" : "Rivals", // group name 
    "contact_name" : "Franke Frankers" 
} 

Вам не нужно будет делать второй запрос, если включают обычно требуется информация, но если контакт обновляет его/ее информацию, которую вы возможно, потребуется обновить каждый контактный документ, ссылающийся на них.

+0

Спасибо, друг! Хорошие моменты! – Moody

+0

Я использую GridFS для фото сейчас, кстати (без blob). Если вы считаете, что это может быть сделано лучше, пожалуйста, дайте мне знать! :) – Moody