Производительность: Храните лайки в Postgresql ArrayField (пример django) - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 2 модели: Post и Comment, каждая может понравиться User.

1) Конечно, общее количество лайков должно быть показано где-то рядом с каждым Post или Comment

2) Но также у каждого User должна быть страница со всем понравившимся контентом.

Итак, самый очевидный способ - это просто сделать это с полем m2m, что, по-видимому, приведет к большому количеству проблем в будущем.

А что по этому поводу?

Модели

1) Post и Comment должны иметь

users_liked_ids = ArrayField(models.IntegerField())

2) User модель также должна иметь такие поля:

posts_liked_ids = ArrayField(models.IntegerField())
comments_liked_ids = ArrayField(models.IntegerField())

И каждый раз User что-то нравится, выполняются два действия:

1) Идентификатор пользователя добавляет в поле users_liked_ids сообщения / комментария

2) Идентификатор поста / комментария добавляет в поле posts_liked_ids/comments_liked_ids пользователя

Вопросы:

1) Это хороший план?)

2) Будет ли эффективным сделать поиск при таком подходе, чтобы получить «Это сообщение / комментарий», но текущий пользователь

3) Будет ли лучше хранить лайки в отдельной таблице, а не в любимой модель, но также в ArrayField

4) Возможно, лучше остаться с очевидным m2m?

1 Ответ

0 голосов
/ 10 мая 2018

1) Нет.
2) Определенно нет.
3) Абсолютно, невероятно нет.Не разделяйте ваши данные еще дальше.
4) Да.

Вот некоторые из проблем:

  • нет ссылочной целостности, поскольку вы не можете создавать сторонниеключи в элементах массива, что означает, что вы можете легко иметь значения мусора в массиве идентификаторов
  • Дублирование данных с записями, имеющими идентификаторы пользователей, и пользователи, имеющие идентификаторы записей, означает, что информация может быть синхронизирована (что происходит, когда пользовательили сообщение удалено?)
  • неэффективный поиск в массивах совпадений (ваш # 2)

Ни при каких обстоятельствах не делайте этого.Возможно, вы захотите объединить свои модели «пост» и «комментарий», чтобы упростить взаимосвязь, но для этого предназначены соединительные таблицы.Массивы хороши для случаев использования, в которых не используются внешние ключи или которые могут быть слишком длинными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...