DynamoDB: две таблицы или вторичный индекс с уникальным предварительным условием? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица в AWS DynamoDB, и я хочу иметь возможность быстро запросить ее по двум непересекающимся наборам полей (не одновременно). Я также хочу, чтобы значения наборов полей были уникальными для каждого элемента.

Пример

Элемент имеет AccountId, Name, Id.

Комбинации AccountId и Name должны быть уникальными для каждого элемента - поэтому ни в одном аккаунте не может быть элемента с одинаковым именем, но разные аккаунты могут иметь элементы с одинаковым именем.

Id также должен быть глобально уникальным: ни один из двух элементов не может иметь одинаковый идентификатор, независимо от того, к какой учетной записи он принадлежит.

Элемент необходимо получить по его Id или по AccountId и Name.

Что я сделал

Я создал две таблицы, вторая из которых связана с первой.

table 1
-------
PK(AccountId, Name)
EverythingElse

table 2
-------
PK(Id)
AccountId
Name

Поэтому, когда мне нужно найти элемент по Id я запрашиваю table 2, а затем использую результаты, чтобы запросить table 2 для любых других полей, которые мне нужны. Всякий раз, когда мне это нужно по AccountId и Name, я запрашиваю table 1, и я также получаю любые другие поля / атрибуты, которые мне нужны.

Что я мог бы сделать

Глобальный вторичный индекс на table 1 на Id. Избавьтесь от table 2. Затем, когда я захочу вставить в таблицу, я сделаю это с условием, что Id, который я собираюсь вставить, не существует.

Почему я сделал то, что сделал

Я предпочитаю переложить как можно большую часть моих логи c на что-то другое. Меньше места для ошибок и вообще более простой код. Хотя я более чем готов следовать любым соглашениям, даже если они означают более сложный код логики c.

Вопрос

Должен ли я go с:

  • две таблицы

или

  • одна таблица с глобальным вторичным индексом и предварительным условием для вставок?

Каковы лучшие практики Нет SQL и / или Динамо?

Спасибо за чтение!

...