Если вы хотите одну таблицу, вы можете рассмотреть два типа элементов в этой таблице:
1. (Без аннотации) Изображение
Ключ раздела: imgID_xxx
Ключ диапазона: img
2. Аннотированное изображение пользователем
Ключ раздела: userID_xxx
Ключ диапазона: imgID_xxx
Аннотация: some annotation...
Итак, изначально вы будете есть только ваши 1000 элементов аннотированных изображений, которые пользователи могут запрашивать через GSI (hashKey
- это то, что я называю ключом раздела):
hashKey | rangeKey | isImg | ...
img_0001 | img | 1 |
img_0002 | img | 1 |
...
img_1000 | img | 1 |
Когда любой пользователь загружает любое изображение, которое он получит этот общий для начала элемент «Аннотированное изображение пользователем» генерируется только лениво после того, как пользователь аннотирует изображение.
Если пользователь хочет аннотировать изображение, вам нужно будет написать в «Аннотированный» image "элемент, который будет разделен по идентификатору пользователя, но также должен иметь GSI для imgID
.
Например, если user_111
аннотировал два изображения (img_0002
и img_0042
), а затем user_222
аннотировано только одно изображение (img_0002
):
hashKey | rangeKey | isImg | annotation | imgID |
img_0001 | img | 1 |
img_0002 | img | 1 |
...
img_1000 | img | 1 |
user_111 | img_0002 | | "foo" | img_0002 |
user_111 | img_0042 | | "bar" | img_0042 |
user_222 | img_0002 | | "baz" | img_0002 |
Это позволит пользователю:
- Запросить все изображения (через первый GSI): 1000 возвращенных элементов
- Запрос всех аннотированных изображений (они находятся в одном разделе userID)
- Запросить все аннотации, сделанные на одном изображении (через второй GSI), т.е. в этом случае он вернет один элемент для
img_0042
или два элемента для img_0002
.
При добавлении нового изображения нужно будет добавить только один элемент. Только после того, как пользователь анонсирует это изображение, вам также потребуется создать дополнительный элемент для этого пользователя.