Уведомления

Группа в Telegram: @pythonsu

#1 Июль 11, 2011 12:50:22

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

Здравствуйте.

Только начал изучать 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

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


Спасибо.



Офлайн

#2 Июль 11, 2011 13:51:31

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

Как я понял задача в этом:

LestatCheb
у всех тегов есть параметр is_enabled, который редактирует Модератор, указывая что данный тег будет во всплывающей подсказке при добавлении новых постов.
Оно не пересекается с задачей “как хранить теги в посте”.
Храните, например, массивом:
tags: [ 'sql', 'python', 'linux' ]
а теги будут храниться в отдельной, своей коллекции “tags”, там и будет параметр is_enabled

Отредактировано (Июль 11, 2011 13:53:18)

Офлайн

#3 Июль 11, 2011 13:51:59

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

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 вариант.



Офлайн

#4 Июль 11, 2011 14:12:23

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

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
?



Офлайн

#5 Июль 11, 2011 15:59:40

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

Монго получает json который нужно сохранить. Разница тут на уровне MongoKit.

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

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

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



Отредактировано (Июль 11, 2011 16:02:08)

Офлайн

#6 Июль 11, 2011 16:09:06

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb embedded documents or DBRef?

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

спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version