Я не могу понять, что первичный ключ Range здесь -
и как это работает?
Что они подразумевают под "неупорядоченным индексом хеш-функции в атрибуте хэш-функции и индексом отсортированного диапазона в атрибуте диапазона"?
Я не могу понять, что первичный ключ Range здесь -
и как это работает?
Что они подразумевают под "неупорядоченным индексом хеш-функции в атрибуте хэш-функции и индексом отсортированного диапазона в атрибуте диапазона"?
"Основной ключ хэша и диапазона" означает, что одна строка в DynamoDB имеет уникальный первичный ключ, состоящий из хеша и диапазона. Например, с помощью хэш-клавиши X и клавиши диапазона Y, ваш первичный ключ является фактически XY. Вы также можете иметь несколько клавиш диапазона для одного и того же хеш-ключа, но комбинация должна быть уникальной, например XZ и XA. Позвольте использовать их примеры для каждого типа таблицы:
Основной ключ Hash - первичный ключ состоит из одного атрибута, хеша атрибут. Например, таблица ProductCatalog может иметь ProductID как его первичный ключ. DynamoDB строит неупорядоченный хеш-индекс на этом атрибут первичного ключа.
Это означает, что каждая строка привязана к этому значению. Каждая строка в DynamoDB будет иметь требуемое уникальное значение для этого атрибута. Неупорядоченный хеш-индекс означает, что сказано: данные не упорядочены, и вам не предоставляются какие-либо гарантии того, как хранятся данные. Вы не сможете делать запросы по неупорядоченному индексу, например, Получить все строки с идентификатором Product больше, чем X. Вы пишете и извлекаете элементы на основе хеш-ключа. Например, введите мне строку из этой таблицы с ProductID X. Вы делаете запрос против неупорядоченного индекса, поэтому вы получаете против него, в основном, ключевые значения, очень быстрые и очень малопроизводительны.
Первичный ключ хеширования и диапазона - первичный ключ состоит из двух атрибутов. Первый атрибут - хэш-атрибут, а второй - Атрибут - это атрибут диапазона. Например, форум может быть ForumName и Subject в качестве основного ключа, где ForumName атрибут хеша и Subject - это атрибут диапазона. DynamoDB строит неупорядоченный хэш-индекс для хеш-атрибута и индекс отсортированного диапазона в атрибуте диапазона.
Это означает, что каждый первичный ключ строки является комбинацией хеша и клавиши диапазона. Вы можете сделать прямой доступ к отдельным строкам, если у вас есть как хэш, так и диапазон, или вы можете сделать запрос против индекса отсортированного диапазона. Например, получите Получить все строки из таблицы с помощью ключа Хэша X, которые имеют клавиши дальности больше Y или другие запросы к этому влиянию. Они имеют лучшую производительность и меньшую емкость использования по сравнению со сканами и запросами в отношении полей, которые не индексируются. Из их документация:
Результаты запроса всегда сортируются клавишей диапазона. Если тип данных ключ диапазона - Number, результаты возвращаются в числовом порядке; в противном случае результаты возвращаются в порядке символьного кода ASCII значения. По умолчанию порядок сортировки возрастает. Чтобы изменить порядок, установите для параметра ScanIndexForward значение false
Я, вероятно, пропустил некоторые вещи, когда я набрал это, и я только поцарапал поверхность. Есть гораздо больше аспекты, которые необходимо учитывать при работе с таблицами DynamoDB (пропускная способность, согласованность, емкость, другие индексы, распределение ключей и т.д.)., Вы можете ознакомиться с примерами примеров таблиц и данных.
Как все это смешивается. Сначала строительные блоки:
Думайте об Элементе как о строке, а об атрибуте КВ - как о клетках в этом ряду.
Вы можете сделать (2), только если вы решили, что ваш ПК состоит из (HashKey, SortKey).
Более наглядно, как это сложно, как я это вижу:
+----------------------------------------------------------------------------------+
|Table |
|+------------------------------------------------------------------------------+ |
||Item | |
||+-----------+ +-----------+ +-----------+ +-----------+ | |
|||primaryKey | |kv attr | |kv attr ...| |kv attr ...| | |
||+-----------+ +-----------+ +-----------+ +-----------+ | |
|+------------------------------------------------------------------------------+ |
|+------------------------------------------------------------------------------+ |
||Item | |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+ | |
|||primaryKey | |kv attr | |kv attr ...| |kv attr ...| |kv attr ...| | |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+ | |
|+------------------------------------------------------------------------------+ |
| |
+----------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------+
|1. Always get item by PrimaryKey |
|2. PK is (Hash,RangeKey), great get MULTIPLE Items by Hash, filter/sort by range |
|3. PK is HashKey: just get a SINGLE ITEM by hashKey |
| +--------------------------+|
| +---------------+ |getByPK => getBy(1 ||
| +-----------+ +>|(HashKey,Range)|--->|hashKey, > < or startWith ||
| +->|Composite |-+ +---------------+ |of rangeKeys) ||
| | +-----------+ +--------------------------+|
|+-----------+ | |
||PrimaryKey |-+ |
|+-----------+ | +--------------------------+|
| | +-----------+ +---------------+ |getByPK => get by specific||
| +->|HashType |-->|get one item |--->|hashKey ||
| +-----------+ +---------------+ | ||
| +--------------------------+|
+----------------------------------------------------------------------------------+
Итак, что происходит выше. Обратите внимание на следующие наблюдения. Как мы уже говорили, наши данные принадлежат (Table, Item, KVAttribute). Тогда у каждого предмета есть первичный ключ. Теперь то, как вы составляете этот первичный ключ, имеет значение для доступа к данным.
Если вы решите, что ваш PrimaryKey - это просто хеш-ключ, тогда прекрасно, что вы можете извлечь из него один элемент. Однако, если вы решите, что вашим первичным ключом является hashKey + SortKey, то вы также можете выполнить запрос диапазона по первичному ключу, поскольку вы получите свои элементы по (HashKey + SomeRangeFunction (на ключе диапазона)). Таким образом, вы можете получить несколько элементов с помощью запроса первичного ключа.
Примечание: я не ссылался на вторичные индексы.
@vnr вы можете получить все ключи сортировки, связанные с ключом раздела, просто используя запрос с помощью ключа partion. Нет необходимости в сканировании. Дело в том, что ключ раздела является обязательным в запросе. Клавиша сортировки используется только для получения диапазона данных
Хорошо объясненный ответ уже дан @mkobit, но я добавлю большую картину ключа диапазона и ключа хеша.
Простыми словами range + hash key = composite primary key
CoreComponents Dynamodb
Первичный ключ состоит из хеш-ключа и необязательного ключа диапазона. Хэш-ключ используется для выбора раздела DynamoDB. Разделы являются частями данных таблицы. Клавиши диапазона используются для сортировки элементов в разделе, если они существуют.
Таким образом, оба имеют разные цели и вместе помогают выполнять сложные запросы. В приведенном выше примере hashkey1 can have multiple n-range.
Другим примером диапазона и hashkey является игра, userA (hashkey)
может играть в Ngame (range)
Таблица Music, описанная в таблицах, элементах и атрибутах, является примером таблицы с составным первичным ключом (Artist и SongTitle). Вы можете получить доступ к любому элементу в таблице "Музыка" напрямую, если вы укажете значения Artist и SongTitle для этого элемента.
Составной первичный ключ дает вам дополнительную гибкость при запросе данных. Например, если вы предоставляете только значение для Artist, DynamoDB извлекает все песни этого исполнителя. Чтобы получить только подмножество песен определенного исполнителя, вы можете указать значение для Artist вместе с диапазоном значений для SongTitle.
https://www.slideshare.net/InfoQ/amazon-dynamodb-design-patterns-best-practices https://www.slideshare.net/AmazonWebServices/awsome-day-2016-module-4-databases-amazon-dynamodb -and-amazon-rds https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html