Монго: Вы бы сохранили имя пользователя или ссылку на имя пользователя во второй коллекции? - PullRequest
1 голос
/ 25 октября 2010

Давайте рассмотрим простой пример - пост в блоге.Я хотел бы хранить комментарии к определенному сообщению в том же документе.

messages = { '_id' : ObjectId("4cc179886c0d49bf9424fc74"),
             'title' : 'Hello world',
             'comments' : [ { 'user_id' : ObjectId("4cc179886c0d49bf9424fc74"),
                              'comment' : 'hello to you too!'},
                            { 'user_id' : ObjectId("4cc1a1830a96c68cc67ef14d"),
                              'comment' : 'test!!!'},  
                          ]
           }

Вопрос в том, имеет ли смысл хранить имя пользователя вместо пользовательского первичного ключа objectid, то есть первичного ключа?У обоих есть свои плюсы и минусы, и в том, что если я отобразлю имя пользователя в комментарии, мне не придется запускать второй запрос.В случае, если «Джон Доу» решит изменить свое имя пользователя, мне нужно будет выполнить запрос по всей моей коллекции, чтобы изменить его имя пользователя во всех комментариях / сообщениях.

Что эффективнее?

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

Я буду хранить два поля.Таким образом, вы выполняете только один запрос в наиболее распространенном случае (отображать комментарии).Изменение имени пользователя действительно редко, поэтому вам не придется обновляться очень часто.

Я сохраню user_id, потому что я не люблю использовать естественное поле, такое как имя пользователя, в качестве первичного ключа, и совпадение с идентификатором объекта должно быть быстрее.

2 голосов
/ 25 октября 2010

Конечно, это действительно зависит от того, сколько трафика вы собираетесь получить, сколько комментариев вы ожидаете получить, и т. Д. Но, вероятно, «ваш самый простой способ работает» - ваш друг здесь: проще сохраняйте только user_id, так что делайте это до тех пор, пока он больше не будет работать (например, потому что у вас есть сообщение с 100 000 комментариев, на рендеринг которого уходит 30 секунд), затем денормализуйте и сохраните имя пользователя вместе с комментариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...