Хобрук: Ваш путь к мастерству в программировании

Разработка ключей записи для документно-ориентированной базы данных — передовой опыт

Наша команда начала разработку приложения, поддерживаемого Couchbase DB; для каждого из нас это первый опыт работы с базой данных без SQL.

Мы начали определять наши сущности и переняли практику использования префиксов «type», предложенную руководством Couchbase:

Entity "A":
key: a#123

Entity "B":
key: b#123

Но мы поняли, что путаемся с выбором стратегии создания составных ключей документов. Мы часто пользуемся счетчиками, и они требуют свои документы. Наши ключи усложнились:

Daily counter "x" for entity "A":
key: cntrx#a#123-20140117

Мы рассмотрели разные подходы, но мы все еще новички в этом вопросе и хотели бы спросить совета.

Иерархические ключи вообще хороши? Может ли кто-нибудь поделиться своими лучшими практиками определения нетривиальных ключей?


Ответы:


1

В нашем проекте мы использовали иерархические ключи следующим образом: Первая часть ключа — это что-то вроде имени таблицы из СУБД: users — представляет «таблицу»

Тогда у каждого пользователя есть свой идентификатор в примере:

users:1 - "представляет одного пользователя"

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

Если вы хотите использовать последовательные индексы, такие как id в предыдущем примере, вам нужно получить их из некоторого ключа, поэтому:

users:counter — ключ, который содержит «последний идентификатор пользователя» (он действует как автоинкремент)

Если вам нужно сохранить некоторый «подраздел» для учетной записи пользователя, вы можете сохранить его:

users:<user's id>:subsection.

Более сложный пример

users:1:avatars:1:url - означает, что по этому ключу мы получим URL-адрес аватара пользователя 1, но если пользователь хочет хранить много аватаров, они будут идти под users:1:avatars:X:url, где X будет значением ключа users:1:avatars:counter.

Мы использовали эту стратегию для всех документов, которые хранят только одно значение, JSON или даже двоичные данные.

Так что именно для вашего примера я выберу:

a:123-20140117:counter - это будет означать, что у нас есть (говоря на языке СУБД) таблица с именем "a", в таблице "a" у нас есть запись с id (или что-то еще) "123-20140117" с полем "cntrx".

UPD: О размере ключа. На самом деле это не имеет значения. Да, ключи ограничены в размере, но есть много способов его уменьшить. Один из них - использовать хэши, но я думаю, что это плохой способ, потому что ключи будут длинными и потреблять больше памяти. В нашем проекте мы использовали «короткие» ключи для ведра memcached. У нас было перечисление (которое также можно хранить в Couchbase), представляющее понятное человеку имя ключа и его сокращенное значение.

Пример: у нас есть некоторый набор записей: список пользователей, у которых более 30 фотографий. Итак, у нас есть пара ключ-значение:

usersByPhotosCount - k:ubpc:{0}

а для 30 фото ключ будет k:ubpc:30.

Но такие оптимизации лучше делать только на продакшене. В разработке лучше иметь понятные ключи в приложении и базе данных (т.е. вы можете создать два набора пар k-v: обычные для разработки, укороченные и запутанные для производства и загружать их в зависимости от вашей среды).

17.01.2014

2

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

Общий

Nosql именно таков, как это звучит, и требует совсем другого мышления, чем ранее использовавшееся для разработки хороших баз данных SQL. Например, база данных nosql представляет собой большую хеш-карту. Таким образом, хотя было бы неплохо подумать о своих ключах (например, сделать их маленькими), помните, что они — всего лишь средство доступа к вашим документам. Если нет какого-то конкретного преимущества, связанного с тем, что они выглядят определенным образом, они вообще не должны ничего означать - обычно сначала требуется первичный поиск. Например, как часто ваши пользователи будут знать, что им нужно запросить b # 123 непосредственно при переходе к вашему приложению? Единственное место, где я могу думать, что это выгодно, - это имя пользователя или какой-либо другой элемент данных, который пользователь должен знать.

Составные ключи

Хотя в руководстве CB может быть указано, что составные ключи являются хорошей идеей (и они вполне могут быть для простых структур базы данных), в целом размер ключа должен быть как можно меньше. Ключи ограничены максимальным размером 256 байт. Все ключи должны храниться в оперативной памяти — поэтому чем больше данных в ваших ключах, тем меньше будет доступно для остальных ваших данных. Вместо этого я бы предложил создать поле типа в вашем документе, а затем использовать представление для извлечения объектов определенного типа (или для индексации объектов по типу). В конечном итоге это даст вам большую гибкость в будущем.

Счетчики

Ваше объяснение счетчиков довольно расплывчато, поэтому я делаю предположение, что вы используете их как ключ автоинкремента. Я бы предположил, что здесь нужно изменить подход, чтобы уйти от счетчиков. Я использую уникальные идентификаторы для всех ключей в моей базе данных. Когда я использую составной ключ, это связано с тем, что сам ключ имеет значение (например, в документах с контролируемой редакцией я использую составной ключ из идентификатора документа + даты сохранения документа, чтобы обеспечить его уникальность). Даже если у вас есть несколько миллионов (или даже миллиардов) объектов, вы можете использовать 12 байтов GUID, чтобы практически гарантировать уникальность ваших идентификаторов документов. Это предотвращает действительно серьезное узкое место в вашем приложении, когда необходимо сохранить новые записи.

18.01.2014
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..