Внешние ключи в монго?

enter image description here

Как я могу разработать такую схему в MongoDB? Я думаю, что нет никаких внешних ключей!

4 ответов


Вам может быть интересно использовать ORM, такой как Mongoid или MongoMapper.

http://mongoid.org/docs/relations/referenced/1-n.html

в базе данных NoSQL, такой как MongoDB, есть не "таблицы", а документы. Документы группируются внутри коллекций. Вы можете иметь любой документ-с любыми данными-в одной коллекции. В принципе, в базе данных NoSQL вам решать, как организовать данные и их отношения, если есть любой.

то, что Mongoid и MongoMapper делают, это предоставить вам удобные методы для настройки отношений довольно легко. Проверьте ссылку, которую я дал вам, и спросите любую вещь.

Edit:

в mongoid вы напишете свою схему так:

class Student
  include Mongoid::Document

    field :name
    embeds_many :addresses
    embeds_many :scores    
end

class Address
  include Mongoid::Document

    field :address
    field :city
    field :state
    field :postalCode
    embedded_in :student
end

class Score
  include Mongoid::Document

    belongs_to :course
    field :grade, type: Float
    embedded_in :student
end


class Course
  include Mongoid::Document

  field :name
  has_many :scores  
end

Edit:

> db.foo.insert({group:"phones"})
> db.foo.find()                  
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")}) 
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }

Вы можете использовать этот ObjectId для выполнения отношений между документами.


как спроектировать такую таблицу в mongodb?

во-первых, чтобы уточнить некоторые соглашения об именах. MongoDB использует collections вместо tables.

Я думаю, что нет внешних ключей!

возьмите следующую модель:

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: [
    { course: 'bio101', mark: 85 },
    { course: 'chem101', mark: 89 }
  ]
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

ясно, что список курсов Джейн указывает на некоторые конкретные курсы. База данных не применяет никаких ограничений к системе (т. е.: внешний ключ contstraints), так там нет "каскадных удалений"или" каскадных обновлений". Однако база данных содержит правильную информацию.

кроме того, MongoDB имеет стандарт DBRef это помогает стандартизировать создание этих ссылок. На самом деле, если вы посмотрите на эту ссылку, у нее есть аналогичный пример.

как я могу решить эту задачу?

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


С Маленькая Книга MongoDB

еще одна альтернатива использованию соединений-денормализация ваших данных. Исторически денормализация была зарезервирована для код, зависящий от производительности, или когда данные должны быть snapshotted (как в журнале аудита). Однако с- растет популярность NoSQL, многие из которых не имеют соединений, денормализация как часть нормального моделирования становится более обычной. Это не означает, что вы должны дублировать каждый информация в каждом документе. Однако, вместо того чтобы позволить страху дублирования данных управлять вашими проектными решениями, рассмотрите возможность моделирования ваших данных на основе информация принадлежит к какому документу.

и

student
{ 
    _id: ObjectId(...),
    name: 'Jane',
    courses: [
    { 
        name: 'Biology 101', 
        mark: 85, 
        id:bio101 
    },
  ]
}

Если это данные API RESTful, замените идентификатор курса ссылкой GET на ресурс курса


мы можем определить так называемый foreign key в MongoDB. Тем не менее, мы должны поддерживать целостность данных САМИ. Например,

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: ['bio101', 'bio102']   // <= ids of the courses
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

на