Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Foreign keys in mongo?

enter image description here

How do I design a scheme such this in MongoDB? I think there are no foreign keys!

like image 663
Mark Pegasov Avatar asked Jun 13 '11 17:06

Mark Pegasov


People also ask

What is foreign key in Mongo?

The foreign keys can be used in the Relational Databases for visualizing data from multiple collections simultaneously. The way MongoDB stores data is also different. Instead of using tables, columns, and rows, MongoDB uses collections, objects, and fields.

Does Mongo have foreign key?

Typically, MongoDB doesn't work with the concept of foreign keys. However, relational databases can use foreign keys to visualize data from multiple collections simultaneously.

How can you achieve a primary key-foreign key relationship in MongoDB?

The primary key-foreign key relationship can be achieved by embedding one document inside the another. As an example, a department document can have its employee document(s) embedded.

Does NoSQL use foreign keys?

NoSQL databases do not support foreign keys or joins and do not have the concept of referential integrity. Let's explore different kinds of NoSQL databases and when it's appropriate to use each.


2 Answers

How to design table like this in mongodb?

First, to clarify some naming conventions. MongoDB uses collections instead of tables.

I think there are no foreign keys!

Take the following model:

student {    _id: ObjectId(...),   name: 'Jane',   courses: [     { course: 'bio101', mark: 85 },     { course: 'chem101', mark: 89 }   ] }  course {   _id: 'bio101',   name: 'Biology 101',   description: 'Introduction to biology' } 

Clearly Jane's course list points to some specific courses. The database does not apply any constraints to the system (i.e.: foreign key constraints), so there are no "cascading deletes" or "cascading updates". However, the database does contain the correct information.

In addition, MongoDB has a DBRef standard that helps standardize the creation of these references. In fact, if you take a look at that link, it has a similar example.

How can I solve this task?

To be clear, MongoDB is not relational. There is no standard "normal form". You should model your database appropriate to the data you store and the queries you intend to run.

like image 57
Gates VP Avatar answered Sep 28 '22 19:09

Gates VP


You may be interested in using a ORM like Mongoid or MongoMapper.

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

In a NoSQL database like MongoDB there are not 'tables' but collections. Documents are grouped inside Collections. You can have any kind of document – with any kind of data – in a single collection. Basically, in a NoSQL database it is up to you to decide how to organise the data and its relations, if there are any.

What Mongoid and MongoMapper do is to provide you with convenient methods to set up relations quite easily. Check out the link I gave you and ask any thing.

Edit:

In mongoid you will write your scheme like this:

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" } 

You can use that ObjectId in order to do relations between documents.

like image 43
Nerian Avatar answered Sep 28 '22 21:09

Nerian