Моей первой мыслью (я только сам изучаю DynamoDB, так что это может быть наивно) будет таблица USER с составным ключом сортировки и глобальными вторичными индексами:
Создание таблицы с USERS в качестве вашего разделаключ, с атрибутами TECH и SKILL, и создайте составное поле TECHSKILL в качестве ключа сортировки.Вы можете добавить значение поля TECHSKILL во входной преобразователь (просто соедините TECHNIQUE и SKILL с разделителем, что-то вроде TECHNIQUE # SKILL).Это позволяет выяснить, имеет ли данный ПОЛЬЗОВАТЕЛЬ определенный TECH или SKILL, используя условия запроса (например, «начинается с») на ключе сортировки.
Затем добавьте глобальные вторичные индексы на TECH и SKILL иTECH: поля SKILL (таким образом, у вас есть три GSI), каждое с ключом сортировки USER.Теперь вы можете запросить TECH GSI, чтобы найти всех ПОЛЬЗОВАТЕЛЕЙ с заданным TECH, или запросить SKILL GSI, или даже запросить всех ПОЛЬЗОВАТЕЛЕЙ с заданной комбинацией TECH: SKILL.
С этим подходом с несколькими GSI вы можетеуправляйте возможностями чтения / записи по-разному для ваших различных запросов.
Это может оказаться неэффективным (я думаю), если ПОЛЬЗОВАТЕЛЬ может иметь комбинацию TECHSKILL более одного раза.Например, предположим, что TECHNIQUE является «драйвером», а в поле SKILL содержится категория водительских прав (TYPE_A, TYPE_C и т. Д.).Теперь пусть ПОЛЬЗОВАТЕЛЬ имеет лицензию TYPE_A на часть года, затем он получает TYPE_C (так, новая запись), но затем сертификат TYPE_C теряет силу, и он возвращается к TYPE_A в другом диапазоне дат, и у вас есть первичный ключСтолкновение, вы получите список кортежей, а не один, и вам придется справиться с этим.Если вы не хотите передавать / проверять / сортировать возвращаемый запрос (возможно, это длинный список!), Вам может потребоваться другой дизайн, возможно, что-то, включающее даты начала / окончания, как часть вашего ключа сортировки для индексов.