如何在MongoDB中设计这样的方案?我想没有外键!
发布于 2011-06-13 17:46:33
您可能会对使用对象关系映射感兴趣,如Mongoid或MongoMapper。
http://mongoid.org/docs/relations/referenced/1-n.html
在像MongoDB这样的NoSQL数据库中,没有‘表’,而是集合。文档在集合中分组。您可以在单个集合中包含任何类型的文档和任何类型的数据。基本上,在NoSQL数据库中,如何组织数据及其关系是由您决定的。
Mongoid和MongoMapper所做的就是为您提供方便的方法来非常容易地建立关系。查看我给你的链接,并提出任何问题。
编辑:
在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
编辑:
> 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来处理文档之间的关系。
发布于 2011-06-13 18:03:55
如何在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'
}
显然,Jane的课程列表指向了一些特定的课程。数据库不会对系统应用任何约束(即:外键约束),因此没有“级联删除”或“级联更新”。但是,数据库确实包含正确的信息。
此外,MongoDB还提供了一个DBRef standard来帮助标准化这些引用的创建。事实上,如果你看一下这个链接,它有一个类似的例子。
如何解决此任务?
需要说明的是,MongoDB不是关系型的。没有标准的“范式”。您应该为您的数据库建模,使其适合您存储的数据和要运行的查询。
发布于 2017-05-08 11:05:24
我们可以在MongoDB中定义所谓的foreign key
。但是,我们需要通过自己的来维护数据完整性。例如,
student
{
_id: ObjectId(...),
name: 'Jane',
courses: ['bio101', 'bio102'] // <= ids of the courses
}
course
{
_id: 'bio101',
name: 'Biology 101',
description: 'Introduction to biology'
}
courses
字段包含课程的_id
。定义一对多关系很容易。但是,如果我们想要检索Jane
**,学生的课程名称,我们需要通过_id
**.** _id
**.**执行另一个操作来检索** course
文档
如果删除了课程bio101
,我们需要执行另一个操作来更新student
文档中的courses
字段。
更多信息: MongoDB模式设计
MongoDB的文档类型特性支持以灵活的方式定义关系。要定义一对多关系:
嵌入式文档
示例:
student
{
name: 'Kate Monster',
addresses : [
{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }
]
}
子引用
就像上面的student
/course
示例。
父引用
适用于一对多,如日志消息。
host
{
_id : ObjectID('AAAB'),
name : 'goofy.example.com',
ipaddr : '127.66.66.66'
}
logmsg
{
time : ISODate("2014-03-28T09:42:41.382Z"),
message : 'cpu is on fire!',
host: ObjectID('AAAB') // Reference to the Host document
}
实际上,host
是logmsg
的父对象。考虑到日志消息非常庞大,引用host
id可以节省大量空间。
参考文献:
https://stackoverflow.com/questions/6334048
复制