Найти - Пользователи
Полная версия: mongodb embedded documents or DBRef?
Начало » Базы данных » mongodb embedded documents or DBRef?
1
LestatCheb
Здравствуйте.

Только начал изучать mongodb, и возник вопрос.

как например там создать схемы Post и Tags?
допустим есть что-то такое:
class Tag(Document):
structure = {
'name': unicode,
'is_enabled': bool,
}
required_fields = ['name']
default_values = {
'is_enabled': False
}
и такое:
class Post(Document):
structure = {
'title': unicode,
'body': unicode,
'author': unicode,
'date_creation': datetime.datetime,
'tags': [], # Tag's array
}
required_fields = ['title', 'author', 'date_creation']
default_values = {
'date_creation': datetime.datetime.now
}
у всех тегов есть параметр is_enabled, который редактирует Модератор, указывая что данный тег будет во всплывающей подсказке при добавлении новых постов.

как лучше включать теги в посты?

варианты:
1) храня просто ObjectID в списке:
tags: [ObjectId('4e16e5f3daf6d5077e000000'), ObjectId('4e1aa33cdaf6d52128000000')]
2) передавая объект Tag в список tags:
tags: [{u'_id': ObjectId('4e16e5f3daf6d5077e000000'),
u'is_enabled': True,
u'name': u'python'},
{u'_id': ObjectId('4e1aa33cdaf6d52128000000'),
u'is_enabled': False,
u'name': u'nosql'}]
3) через DBRef:
tags: [DBRef(u'tags', ObjectId('4e16e5f3daf6d5077e000000')),
DBRef(u'tags', ObjectId('4e1aa33cdaf6d52128000000'))]
для работы с mongo юзается mongokit.

в случае с DBRef скорость будет ведь меньше чем embedded documents?
и в 1) получается тоже отдельно нужно будет query делать для получения тегов?
т.е. для максимальной скорости только 2) вариант годится? + тогда получается нужно как-то отдельно обновлять все посты, при изменении галочки is_enabled в коллекции tags

Или какие тут еще варианты могут быть?


Спасибо.
o7412369815963
Как я понял задача в этом:
LestatCheb
у всех тегов есть параметр is_enabled, который редактирует Модератор, указывая что данный тег будет во всплывающей подсказке при добавлении новых постов.
Оно не пересекается с задачей “как хранить теги в посте”.
Храните, например, массивом:
tags: [ 'sql', 'python', 'linux' ]
а теги будут храниться в отдельной, своей коллекции “tags”, там и будет параметр is_enabled
Sleepwalker
LestatCheb
в случае с DBRef скорость будет ведь меньше чем embedded documents?
Да, будет меньше. Для каждого поста будет выполнятся запрос на список тегов (derefference).

LestatCheb
т.е. для максимальной скорости только 2) вариант годится? + тогда получается нужно как-то отдельно обновлять все посты, при изменении галочки is_enabled в коллекции tags
Вообще в документации пишут что в случае с отношениями один-ко-многим (если перенести все на реляционную модель) стоит делать embedded документы.

class Post(Document):
structure = {
'title': unicode,
'body': unicode,
'author': unicode,
'date_creation': datetime.datetime,
'tags': [Tag], # Tag's array
}
required_fields = ['title', 'author', 'date_creation']
default_values = {
'date_creation': datetime.datetime.now
}
Вообще DBRef лучше использовать когда ссылаетесь на данные с разных коллекций. В вашем же случае, лучше хранить список ObjectId тегов для поста, если нужны ссылки. Но я бы рекоммендовал embedded вариант.
LestatCheb
o7412369815963
Храните, например, массивом:
tags: [ 'sql', 'python', 'linux' ]
а теги будут храниться в отдельной, своей коллекции “tags”, там и будет параметр is_enabled
хм, пожалуй да, так и сделаю.
спасибо!


Sleepwalker
'tags': [Tag], # Tag's array
а как в структуре лучше описывать что это массив именно Tag, а не скажем User или еще кого-то?
т.е. для монго есть разница между
'tags': [Tag], # Tag's array
и
'tags': [], # Tag's array
?
Sleepwalker
Монго получает json который нужно сохранить. Разница тут на уровне MongoKit.

В случае с "'tags': “ вы сможете записать в атрибут обьекта Post только список из обьектов Tag, иначе MongoKit вызовет ошибку валидации.

А при ”'tags': “ вы сможете что угодно писать в post.tags.

Ну и соответственно когда Вы достанете обьект Post из базы - то в tags будет либо список обьектов Tag (”tags': "), либо чего угодно (диктов, строк или чего Вы там запишете).
LestatCheb
Sleepwalker
В случае с "'tags': " вы сможете записать в атрибут обьекта Post только список из обьектов Tag, иначе MongoKit вызовет ошибку валидации.
о, супер!

спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB