Как выбрать ключ раздела для базы данных Graph в Azure CosmosDB

#azure-cosmosdb #gremlin #partitioning #graph-databases

#azure-cosmosdb #gremlin #разделение #графические базы данных

Вопрос:

Я работаю с Azure CosmosDB, и, более конкретно, с API Gremlin, и я немного зациклен на том, что выбрать в качестве ключа раздела.

Действительно, поскольку я использую данные graph, не все вершины соответствуют одной и той же схеме данных. Если я выберу свойство, которое не является общим для всех вершин, Azure не позволит мне хранить вершины, у которых нет значения для ключа раздела. Проблема в том, что единственное свойство, которое у них у всех есть общее, это /id , но Azure не позволяет использовать это свойство в качестве ключа раздела.

Означает ли это, что мне нужно создать свойство, которое будет общим для всех моих вершин? Разве это немного не убивает назначение данных graph? Или я что-то упускаю?

Например, в моем случае я хочу смоделировать объект и его части. Каждый объект и каждая часть имеют свойство /identificationNumber . Было бы лучше использовать это свойство в качестве ключа разделения или создать новое свойство /partitionKey , предназначенное для целей разделения? Меня беспокоит то, что, если я выберу /identificationNumber в качестве ключа раздела, и если моя модель данных должна будет развиваться в будущем, если мне придется моделировать новые объекты без /identificationNumber , мне придется искусственно добавлять это свойство к этим объектам модели данных, что может привести к некоторой путанице.

Комментарии:

1. По определению, все элементы в разделенной базе данных должны обладать ключом раздела, следовательно, это неотъемлемо общее свойство, даже если это просто идентификатор или его копия / производная. Было бы полезно поделиться реальными примерами ваших данных, чтобы получить соответствующие рекомендации по возможным ключам раздела.

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

Ответ №1:

Создание специального свойства для использования в качестве синтетического ключа раздела является хорошей практикой, если нет очевидного существующего свойства для использования. Этот подход может смягчить случаи, когда у вас нет /identificationNumber в некоторых объектах, поскольку в этих случаях вы можете присвоить какое-либо другое значение в качестве partitionKey . Это также обеспечивает гибкость при проведении рефакторинга /identificationNumber в будущем, поскольку partitionKey это то, что должно быть неизменным.

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

Комментарии:

1. Большое вам спасибо за ваш ответ. Я также узнал, что создание свойства /partitionKey рекомендуется Microsoft в качестве наилучшей практики для моделирования данных graph: learn.microsoft.com/en-us/azure/cosmos-db/graph-modeling . Итак, я думаю, я пойду с этим решением. Я просто осторожен, потому что модель данных должна быть открыта и использована повторно.