Внешние ключи в монго?
Как мне разработать такую схему в MongoDB? Я думаю, что нет никаких внешних ключей!
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 не является реляционным. Нет никакой стандартной "нормальной формы". Вы должны моделировать ваш база данных, соответствующая хранящимся данным и запросам, которые вы собираетесь выполнять.
еще одна альтернатива использованию соединений-денормализация данных. Исторически, денормализация была зарезервирована для код, чувствительный к производительности, или когда данные должны быть привязаны (например, в журнале аудита). Однако с- растет популярность 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