Несколько условий сравнения по ключу сортировки для DynamoDB? - PullRequest
1 голос
/ 17 октября 2019

Я использую AWS SDK2 DynamoDB для приложения со следующей схемой:

personId    startDate    endDate     name    age  job
1           10/2/2013    10/3/2020   Bob     12   SWE
1           8/2/2013     10/3/2021   Bob     12   EE
2           10/2/2013    10/3/2021   Joe     17   Student
3           11/2/2013    10/3/2022   Kim     16   Boss

Моя цель - иметь возможность запросить таблицу по personId и date, чтобы получитьобъект человека. В настоящее время я думаю о partition key на personId;однако, я не уверен, как спроектировать мой sortKey.

Например, скажем, я хочу person с personId = 1 и date = 10/5/2019, я ожидаю, что будут возвращены первая и вторая запись таблицы примера, потому что дата находится между startDate иendDate. Как я могу спроектировать sortKey так, чтобы я мог использовать соответствующее ключевое условие выражения, чтобы сказать что-то вроде даты между startDate и endDate? Я знаю, что выражение фильтра можно использовать, но мне было интересно, был ли способ спроектировать ключ сортировки так, чтобы фильтр не требовался, поскольку он более дорогой.

1 Ответ

0 голосов
/ 18 октября 2019

Нет, вы не можете.

Зачем вам в любом случае ключ сортировки? Если personId уникален, вам не нужен составной первичный ключ (хэш + сортировка).

И поскольку вы знаете personId при чтении, вы можете просто использовать GetItem (таблица, HK =: personId)

Редактировать

Учитывая дополнительную информацию, что personId не является уникальным ...

Пусть startDate будет вашим ключом сортировки ...

Вы сможете выполнить запрос (таблица, HK =: personId, SK <=: date, ScanIndexForward = false, limit = 1) </p>

Это вернет единственную запись с самой последней датой начала, меньшей илиравно дате, которую вы указали.

Эквивалент SQL будет выглядеть так:

select *
from table
where personId = :personId 
      and startDate <= :date
order by startDate desc
fetch first row only

EDIT2
Не увидел обновленную информацию в вопросе. Если у человека могут быть перекрывающиеся задания, вам нужно выйти за пределы и выполнить фильтрацию (либо в DDB, либо в вашем клиентском приложении)

DDB не самый лучший вариант для всех, поскольку данныеВы выложили, у вас есть два варианта: платить больше за RCB DDB или платить больше за RDB.

Сказав это, я укажу, что RCU DDB покрывает до 4KBdata.

Если ваши строки DDB меньше, вы можете вернуть несколько строк одним вызовом Query (), который стоит всего 1 RCU.

Если размер строки 512b, вы можете вернуть 8 строк для одного RCU.

...