Лучший способ структурировать таблицу DynamoDB? - PullRequest
0 голосов
/ 03 мая 2020

Я создаю веб-сайт, на котором пользователи извлекают изображения и добавляют к ним аннотации, и я борюсь с наиболее эффективным способом структурирования таблицы. Примите во внимание следующее:

  • Пользователи не должны видеть одно и то же изображение дважды, поэтому мне нужно манипулировать некоторым элементом таким образом
  • В таблице будет указано около 1000 изображений
  • Неизвестное количество пользователей, но я сомневаюсь, что достигну предела размера элемента в 400 КБ.
  • В какой-то момент я хотел бы разыграть метаданные, чтобы пользователи могли сравнивать свои метаданные с другими

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

1 Ответ

3 голосов
/ 03 мая 2020

Если вы хотите одну таблицу, вы можете рассмотреть два типа элементов в этой таблице:

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.

При добавлении нового изображения нужно будет добавить только один элемент. Только после того, как пользователь анонсирует это изображение, вам также потребуется создать дополнительный элемент для этого пользователя.

...