MongoDB. Часть 3.
Apr 16, 2015 04:05 · 385 words · 2 minutes read
Косвенно мы уже упоминали о том, что проект НГС.Авто использует MongoDB в качестве основного хранилища данных. Логично, что за время использования этого решения на бою у нас накопилось некоторые рекомендации по работе с ним. Этими рекомендациями и нюансами нам хотелось бы поделиться с вами. И первое, что стоит обсудить - MongoID.
Наверняка, многие из вас знают, что в большинстве реляционных и нереляционных (NoSql) баз данных используются первичные ключи.
Первичный ключ — это поле или набор полей со значениями, которые являются уникальными для всей таблицы. Значения ключа могут использоваться для обозначения всех записей, при этом каждая запись имеет отдельное значение ключа.
В качестве такого первичного ключа в MongoDB по умолчанию используется MongoID. Это значит, что при вставке любого документа в коллекцию к нему будет добавлено поле вида:
"_id": ObjectId("540429f48a88af719aae71d5").
Что же такое MongoID? Это 12 байтный тип данных в формате BSON, который использует MongoDB для хранения уникальных идентификаторов. Из них: * 4 байта - отметка времени (timestamp) * 3 байта - хеш имени хоста клиента * 2 байта - последние 2 значащих байта идентификатора процесса исполнения скрипта * 2 байта - автоинкрементное значение
Эти объекты могут быть легко сериализованы и десериализованы.
Так что же такого полезного в MongoID? Какие плюсы можно выделить?
- Уникальность для данной коллекции.
- Нет необходимости самостоятельно следить за инкрементальностью ключа.
- Поставляется из коробки - нет необходимости придумывать свои алгоритмы получения уникального идентификатора записи.
- Хорошо работает с шардированием.
- Можно использовать для хранения времени - сортировки работают - как по временной метке.
Из минусов можно отметить плохую читаемость. Достаточно сложно будет запомнить набор символов - 540429f48a88af719aae71d5.
А теперь представьте, что это будет идентификатор объявления? Не всегда удобно, согласитесь :)
Поэтому идентификатор MongoID у нас используется для служебных коллекций, например, для списка загруженных файлов пользователями.
Если внимательно посмотреть на то, из чего состоит MongoID - то можно увидеть, что первые 4 байта - это текущая отметка времени. Как приятный бонус - эту временную метку (timestamp) можно легко достать.
Подводя итог, можно сказать следующее: Если в вашем проекте отсутствуют требования по удобочитаемости идентификатора, то можно смело использовать MongoID. Из-за присутствия метки времени можно отказаться от хранения даты создания документа - её всегда можно будет достать из идентификатора документа. Кроме того, используя MongoID вы делаете вклад в развитие проекта на перспективу: в тот момент, когда вам понадобится шардинг, MongoID отлично с ним сработается :)