2013-08-13 5 views
4

Я новичок в использовании баз данных NoSQL. У меня есть таблица в DynamoDB с более чем 100 000 элементов в ней. Кроме того, эта таблица часто обновляется. На этом столе, я хочу, чтобы иметь возможность сделать что-то похожее на это в мире баз данных соотношения:MAX операции в Amazon DynamoDB

Select * 
from tableName 
where attributeName = (Select MAX(attributeName) from tableName); 

Есть ли недорогой способ сделать это без того, чтобы извлечь все строки в мой Java-код? Любые входы/указатели будут оценены. Благодарю.

ответ

2

Существует не дешевый способ сделать это без добавления места или сложности.

Дорогим способом было бы сканировать всю таблицу, извлекать только атрибуты ключа и атрибут attributeName, вычислять max, а затем получать все (полные) элементы, найденные с помощью этого макс.

Если у вас есть составной ключ (хеш и диапазон) и несколько хеш-ключей относительных общих элементов в таблице, то Local secondary indexes поможет и будет стоить всего немного места. У вас может быть индекс в атрибуте attributeName, а затем запрос на каждый хэш-ключ с использованием этого индекса, а также «isScanIndexForward: false» и «limit: 1», чтобы получить «max» из этого hashKey. Затем вы вычисляете максимальное количество всех результатов (1 результат от каждой хэш-клавиши), и вы знаете значение для извлечения. Вы можете получить их все одинаково, с обратным просмотром и условием «EQ» на attributeName.

Если вы хотите добавить сложность, вы можете сохранить эту информацию в дополнительной таблице. Что-то вроде tableName.extraInfo, у которого есть такой элемент: {hashKey: "maxOfAttributeName", "value":5}. Затем, когда вы put или update в главной таблице, вы также обновляете это поле, и у вас есть ваша ценность. Остерегайтесь сложностей транзакций, связанных с этим подходом, если ваши данные быстро меняются.

+0

Обратите внимание, что этот ответ может быть более правильным. С тех пор DynamoDB выпустил локальные вторичные индексы. –