Как добиться `select * из порядка InternalProductionDb по DateTimeStamp desc limit 10` в aws-Dynamodb - PullRequest
0 голосов
/ 12 января 2019

У меня есть таблица в DynamodB, структура таблицы выглядит следующим образом: InternalProductionDb PK StatusId равен String, а ключ сортировки DateTimeStamp равен Number. Я хочу достичь select * from InternalProductionDb order by DateTimeStamp desc limit 10;

let params = {
    ExpressionAttributeValues: {
        ':min': {
            N: '200000000000'
        },
        ':max': {
            N: '300000000000'
        },
        ':beg':{
            S:'2'
        }
    },
    TableName: "InternalProductionDb",
    ConsistentRead: true,
    Limit: 10,
    KeyConditionExpression:' DateTimeStamp between :min and :max and begins_with(StatusId,:beg)' ,
    ScanIndexForward:true
};
let res = await ddb.query(params).promise();
console.dir(res);
return res;

На самом деле, поскольку мне не нужно делать никаких условных суждений, мне действительно не нужен KeyConditionExpression, но API должен указывать параметр KeyConditionExpression. Итак, я написал два неизбежных суждения. Я думаю, что это слишком сложно, и я получил ошибку. ошибка Query key condition not supported , Так кто-нибудь знает о правильном решении? Большое спасибо

1 Ответ

0 голосов
/ 12 января 2019

DynamoDB не является реляционной базой данных! Вы запрашиваете довольно сложный запрос к вашей схеме.

Вам нужна схема, оптимизированная для запросов временных рядов, например, "получить 10 самых последних элементов в таблице". Такая схема должна предлагать компромисс между горизонтальным масштабированием (то, что «Динамо» предлагает прямо из коробки) и локальностью данных, чтобы собрать ваш ответ.

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

Конечно, все становится сложнее, если вы не всегда получаете достаточно данных каждый день, и в этом случае выяснить, что является самой последней датой, сложнее. Вы можете изменить гранулярность ключа раздела на неделю / месяц.

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

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

Или вы можете использовать реляционную базу данных вместе с DynamoDB для аналитических запросов.

Дополнительная литература: Рекомендации по работе с базами данных временных рядов на DynamoDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...