Первичный ключ и GSI Design в DynamoDB
Я недавно начал изучать DynamoDB и создал таблицу 'reviews' со следующими атрибутами (наряду с типом DynamoDB):
productId - String
username - String
feedbackText - String
lastModifiedDate - Number (I'm storing the UNIX timestamp)
createdDate - Number
active - Number (0/1 value, 1 for all records by default)
Ниже приведены запросы, которые я ожидаю выполнить для этой таблицы:
1. Get all reviews for a 'productId'
2. Get all reviews submitted by a 'username' (sorted asc/desc by lastModifiedDate)
3. Get N most recent reviews across products and users (using lastModifiedDate)
Теперь, чтобы иметь возможность выполнять эти запросы, я создал следующее в таблице "обзоры":
1. A Primary Key with 'productId' as the Hash Key and 'username' as the Range Key
2. A GSI with 'username' as the Hash Key and 'lastModifiedDate' as the Range Key
3. A GSI with 'active' as the Hash Key and 'lastModifiedDate' as the Range Key
Последний индекс является своего рода хаком, так как я ввел атрибут "активный" только в своей таблице, так что значение может быть "1" для всех записей, и я могу использовать его в качестве хэш-ключа для GSI.
Мой вопрос прост. Я уже читал немного о DynamoDB, и это лучший дизайн, который я мог придумать. Я хочу спросить, есть ли лучший дизайн первичного ключа / индекса, который я мог бы использовать здесь. Если в DynamoDB есть концепция, которую я, возможно, упустил, это может быть полезно в этом конкретном случае использования. Спасибо!
1 ответ
Я думаю, что ваш дизайн правильный:
- ключ таблицы и GSI из пункта 2 покроют ваши первые два запроса. Никаких сюрпризов здесь, это довольно стандартно.
- Я думаю, что ваш дизайн для последнего запроса верен, даже если он несколько хакерский и, возможно, не самый лучший с точки зрения производительности. Использование того же значения для хеш-ключа - это то, что вам нужно сделать, учитывая ограничения DynamoDB. Вы хотите иметь возможность получать значения по порядку, поэтому вам нужно использовать клавишу диапазона. Поскольку вы хотите использовать только ключ диапазона, вам нужно указать то же значение для ключа хеша. Вы должны просто заметить, что это может не очень хорошо масштабироваться, когда ваша таблица разбивается на множество разделов (хотя у меня нет данных, подтверждающих это утверждение).