Если я правильно понимаю вашу проблему, вам не хватает всей концепции баз данных NoSQL.
Ваша таблица Names
должна иметь ключ Hash (аналогичный первичному ключу), который генерируется равномерноидентификатор (UUID является отличным кандидатом).Это автоматически сделает эту таблицу запрашиваемой по этому уникальному идентификатору.Вы сказали, однако, что вы не знаете удостоверение личности, но вместо этого вы знаете только имя.Это заставляет меня думать, что вы можете создать Глобальный вторичный индекс (GSI) для атрибута Name
внутри таблицы Names
, чтобы вы также могли делать запросы по Name
.До этого момента структура вашей таблицы должна выглядеть следующим образом:
id | name
Обе они независимо запрашиваются, что уже дает вам большую гибкость.
Теперь предположим, что вы хотите добавить атрибут NameMapping
(который я не знаю, как он выглядит), вы можете просто добавить его в таблицу Names
, избавившись от таблицы NamesMappings
, значительно уменьшивколичество WCU и RCU в вашем аккаунте.Структура вашей таблицы теперь должна выглядеть следующим образом:
id | name | mappings
, где mappings
- это, скажем, объект JSON.
Поскольку вы можете запрашивать только сверхуАтрибуты уровня в DynamoDB теперь можно выполнять запрос к атрибуту name
, для которого настроен GSI.Если запрос ничего не возвращает, то name
уникален.Но допустим, что вам все еще нужны некоторые данные внутри объекта mappings
, тогда вы можете запросить по name
и, в своем коде , вы можете применить операцию map / filter / reduarn к mappings
атрибут и решить, что делать дальше.
Помните, что дублирование просто нормально в мире NoSQL.Это может показаться пугающим, если вы пришли из чисто SQL-среды, но данные должны храниться в базах данных NoSQL таким образом, чтобы вы могли получать всю необходимую информацию за один раз, избегая, таким образом, join "(объединения все еще возможны в базе данных NoSQL, но поскольку между сущностями нет сильных связей, вам нужно выполнить эти объединения вручную на уровне кода).Чтобы дать вам реальный контекст, представьте, что у вас есть таблица Orders
, в которой вы отслеживаете заказанные Продукты и Магазин, которому принадлежит Заказ: вы сохраняете как Продукты, так и объекты Магазина (а не их идентификаторы, какэто будет происходить способом SQL) внутри объекта Order, поэтому, если вы захотите запросить данный OrderId в будущем, вам не нужно будет делать дополнительные вызовы (или " присоединяет ") кТаблицы Product / Store для получения информации, так как все уже будет храниться внутри объекта Order.