Фотография LIKE, КОММЕНТАРИИ NOSql Дизайн базы данных

Я пытаюсь внедрить систему LIKE и COMMENT, такую ​​как Instagram и Facebook, в DynamoDB.

У меня есть 3 таблицы, пользователь, фото и photo_likes

Таблица пользователя и таблица фотографий имеют ключи user_id и photo_id.

и для таблицы photo_likes у меня есть photo_id в качестве ключа и колонка likes_by, где я храню user_id в виде списка.

Итак, если photo_id 1 нравится user_id 10, 35, я сохраняю его как:

| photo_id | liked_by |
|     1    |  {10,35} |

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

| photo_id | user_id  |
|     1    |    10    |
|     1    |    35    |

1 ответ

Решение

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

Подход 1:

| photo_id | liked_by |
|     1    |  {10,35} |

Преимущество и предложение:-

  • Мое предложение будет хранить liked_by как NS или же SS а не список. Так что у него не будет дубликатов.
  • Все liked_by присутствуют в том же пункте. Это поможет во время поиска и отображения результатов в графическом интерфейсе, если это необходимо

Недостаток:-

  • Невозможно создать индекс (в случае необходимости) для нескалярных типов данных (SS, NS или List)
  • Помните о максимальном размере (400 КБ) элемента в DynamoDB. Это может повлиять на модель данных, если число лайков увеличится до неожиданных значений, что может повлиять на размер элемента

Подход 2:

| photo_id | user_id  |
|     1    |    10    |
|     1    |    35    |

Вы можете определить photo_id в качестве ключа раздела и user_id в качестве ключа сортировки.

Преимущества:-

  • Вы можете создать индекс по user_id, если требуется
  • Вы можете отсортировать данные по user_id (если определен как ключ сортировки)
  • Не нужно беспокоиться о размере элемента 400 КБ

Недостаток:-

  • Подсчет likes должно быть сделано на стороне клиента путем итерации значений. В подходе 1 вы можете использовать некоторые array.length чтобы получить likes подсчитывать
  • Количество элементов в наборе результатов запроса будет большим, что может быть трудно для решения. Этот момент зависит от того, есть ли у вас сценарий использования, чтобы получить список фотографий и его likes считать или любой другой sceanrio
Другие вопросы по тегам