Один к одному против поля в тех же моделях django - PullRequest
0 голосов
/ 15 марта 2020

Я создал два шаблона, у меня есть расширенный шаблон De user (AbsctractUser) и шаблон (Score) с полем total_score.

Из того, что я мог понять о кэше django с redis, является то, что до тех пор, пока строка не изменяется, redis сохраняет информацию в кэше.

Поле total_score будет регулярно обновляться, например, 100 раз каждые 10 минут, если оно добавляется в шаблон AbstractUser, это заставит redis регулярно обновлять кэш пользователя при каждом изменении страницы (представление), тогда как если Я создаю второй шаблон Score с отношением OnetoOne, он будет обновляться только на соответствующих двух страницах, или представление загружает модель Score.

Или я могу прямо указать поле total_score в моем абстрактном пользователе и регулярно его обновлять. Но для меня я теряю эффективность redis для модели Abstract User. Я хотел бы знать, правильны ли мои рассуждения ...

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

Пример:

лучше для обновления Redis Cache (Score_user) Частое обновление строки Score_user:

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)

class Score(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    score_user = models.PositiveIntegerField(default=0)

VS

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)
    score_user = models.PositiveIntegerField(default=0)

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Отделите свое поле Score от пользователя, потому что нормализуете схему базы данных. Это зависит от ситуации, когда вы хотите, чтобы на одной странице отображались как пользователь, так и оценка, и вам нужна некоторая производительность, тогда go с абстрактным пользователем. Сделайте 1 запрос, и вы получите все.

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

И вы также можете сделать отдельный ha sh или строку счета в redis для обновления поля счета. Не обновлять сессию пользователя ha sh.

Но денормализация увеличивает производительность.

1 голос
/ 15 марта 2020

Оба способа могут работать, есть несколько способов: 1. передать пользовательский ключ для кеша, который не содержит параметров update_at, вы можете передать ha sh имени и имени

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