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


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

4 64

4 ответа:

Вы можете быть заинтересованы в использовании ОРМ, как 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 В Книге

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

и

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

если это данные RESTful API, замените идентификатор курса ссылкой 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'
}

The