MongoDB Схема Дизайн --- Дружба с группами - PullRequest
3 голосов
/ 21 апреля 2011

Привет, друзья! Я хочу использовать MongoDB для реализации модели дружбы на основе групп.Как в Google Buzz.Например,
Меня зовут Том, Стив и Гэвин - мои друзья.Стив - мой одноклассник и сотрудник, Гэвин - мой сотрудник.

Tom
  -Group Classmates
     Steve
  -Group Coworkers
     Steve
     Gavin

Мой вопрос - как спроектировать эту схему?
В rails и Mongoid я написал следующий код:

Вот user.rb

class User
  include Mongoid::Document

  field :username
  field :email

  field :block_list, :type => Array, :default => []


  key :username

  embeds_many :groups

  embeds_many :pending_requests

  has_and_belongs_to_many :friends, :class_name => "User"

end

group.rb

class Group
  include Mongoid::Document
  embedded_in :user

  field :name

  field :members, :type => Array, :default => []
end

pending_request.rb


class PendingRequest
  include Mongoid::Document
  embedded_in :user

  field :username
  field :body
end

Есть предложения?Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2011

Есть несколько способов создать схему для этой цели.Одна из важных вещей, которую нужно спросить, заключается в следующем: если Том говорит, что Гэвин - коллега, означает ли это, что Гэвин также покажет Тома как коллегу?

Да : Если Том или Гэвин могутсоздайте связь между ними, и в любом случае это одна и та же ссылка (независимо от процесса создания этой ссылки), тогда то, о чем вы на самом деле говорите, это отношения.Mongo является базой данных NoSql и не выполняет объединений, поэтому вам придется управлять этими отношениями с помощью нескольких запросов выбора и обновления.Том мог вести список сотрудников, а Гэвин мог вести список сотрудников, и каждый раз, когда один из них добавляет другой, оба документа должны будут обновляться.Честно говоря, такого рода отношения - это то, в чем хороши реляционные базы данных.Mongo, вероятно, не лучшее решение.

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

Сохранить вИмейте в виду, что отслеживание отношений между документами не является сильной стороной Монго.Если у вас много отношений с относительно небольшими документами, Mongo на самом деле не лучший выбор.

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

...