Hướng dẫn mongodb constraints foreign key

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

asked Jun 13, 2011 at 17:40

Mark PegasovMark Pegasov

4,9599 gold badges25 silver badges30 bronze badges

4

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.

Frank Schmitt

29.3k11 gold badges69 silver badges105 bronze badges

answered Jun 13, 2011 at 18:03

3

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

//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.

renno

2,5491 gold badge23 silver badges51 bronze badges

answered Jun 13, 2011 at 17:46

NerianNerian

15.6k12 gold badges65 silver badges94 bronze badges

7

We can define the so-called foreign key in MongoDB. However, we need to maintain the data integrity BY OURSELVES. For example,

student
{ 
  _id: ObjectId[...],
  name: 'Jane',
  courses: ['bio101', 'bio102']   // 

Chủ Đề