У меня есть таблица в 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 и / или Динамо?
Спасибо за чтение!