Мы можем определить так называемый 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'
}
Поле courses
содержит _id
с курсов. Легко определить отношение один ко многим. Однако, если мы хотим получить имена курсов студента Jane
, нам нужно выполнить еще одну операцию для получения документа course
через _id
.
Если курс bio101
удален, нам нужно выполнить еще одну операцию для обновления поля courses
в документе student
.
Подробнее: Разработка схемы 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
экономит много места, учитывая, что сообщения журнала составляют миллиарды.
Ссылки:
- 6 Практических правил для схемы схемы MongoDB: Часть 1
- 6 Практических правил для схемы схемы MongoDB: Часть 2
- 6 Практических правил для схемы схемы MongoDB: Часть 3
- Типовые отношения «один ко многим» со ссылками на документы