Для Mongodb лучше ссылаться на объект или использовать натуральный строковый ключ? - PullRequest
8 голосов
/ 18 мая 2011

Я строю корпус проиндексированных предложений на разных языках. У меня есть коллекция языков, в которой ключом является ObjectId и код ISO. Лучше использовать ссылку на коллекцию Language или сохранить ключ типа «en» или «fr»?

Полагаю, это компромисс между:

  • легкость обращения к языку
  • объект в этой коллекции
  • скорость выполнения запросов, когда предложение имеет определенный язык
  • размер данных на диске

Какие-нибудь лучшие практики, которые я должен знать?

Ответы [ 2 ]

7 голосов
/ 18 мая 2011

В конце концов, это действительно сводится к личному выбору и тому, что будет работать лучше всего для вашего приложения.

Требование * , которое MongoDB налагает на _id, заключается в том, что он уникален.Это может быть ObjectId (который предоставляется по умолчанию), строка, даже встроенный документ (хотя, насколько я помню, это не может быть массив).

В этом случае вы, вероятно, можете гарантировать, что код ISO являетсяуникальная ценность, и это может быть идеальной ценностью.У вас есть «известный» первичный ключ, который также полезен сам по себе, поскольку его можно идентифицировать, поэтому использование его вместо сгенерированного идентификатора, вероятно, является более разумной ставкой.Это также означает, что где бы вы ни «ссылались» на эту информацию в другой коллекции, вы можете сохранить код ISO вместо идентификатора объекта;те, кто просматривает ваши необработанные данные, могут сразу определить, на какую информацию указывает эта ссылка.

В качестве отступления:

Два больших преимущества ObjectId в том, что они могут быть сгенерированы уникально на нескольких машинах, процессах ипотоки без необходимости какого-либо отслеживания центральной последовательности сервером MongoDB.Они также хранятся как специальный тип в MongoDB, который использует только 12 байтов (в отличие от 24-байтового представления строковой версии ObjectID)

3 голосов
/ 19 мая 2011

Если дисковое пространство не является проблемой, я бы, вероятно, пошел с языковой клавишей, такой как "en" или "fr". Таким образом экономится выполнение дополнительного запроса к коллекции языков для поиска ключа ObjectId для данного языка, вы можете просто запросить sentences напрямую:

db.sentences.find( { lang: "en" } )

Пока индексировано поле lang - db.sentences.ensureIndex( { lang: 1 } ) - я не думаю, что будет большая разница в производительности запросов.

Если у вас есть огромный набор данных, и дисковое пространство является проблемой, то вы можете рассмотреть ObjectId (12 байт) или число (8 байт), которое может быть меньше, чем строковый ключ UTF-8 в зависимости от его длины.

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