Какой оптимальный вариант модели для описанной задачи (Django)?

Добрый день. Разрабатываю сейчас небольшой сервис, который будет предоставлять доступ к определенным данным, данные разделены по странам, и мне нужно разным пользователям давать доступ только к определенным странам на определенный срок. Проверка, есть ли права на доступ к базе страны, происходит при каждом запросе пользователем данных. На данный момент я вижу несколько вариантов решения этой задачи:

1а. Своя модель юзера с полями на каждую страну, в которые будет записываться дата до когда активен доступ.
+ Простая реализация
+ Всего 1 запрос в базу(который в любом случае выполняется для получения других данных по юзеру)
+ Простая миграция при добавлении дополнительных стран
- Куча лишних полей в модели пользователя
class MyUser(AbstractUser):
    ru = models.DateTimeField(default="2000-01-01 00:00:00.00+00")
    uk = models.DateTimeField(default="2000-01-01 00:00:00.00+00")
    ...

1б. Суть та же, только все страны вынесены в отдельную таблицу, связанную с юзером
+ Не захламляется модель юзера
+ В разделах, где не нужна проверка прав, не получаем лишние данные.
- Лишний join в каждом запросе данных
class Permissions(models.Model):
    user = models.ForeignKey(User)
    ru = models.DateTimeField(default="2000-01-01 00:00:00.00+00")
    us = models.DateTimeField(default="2000-01-01 00:00:00.00+00")
    ...

2. В модель юзера добавляем всего 1 поле, в котором храним словарь "страна - дата".
+ Не захламляется модель юзера
+ За 1 запрос получаем все нужные права
- Более сложная логика в представлениях и шаблонах для проверки прав
- Сильно усложняется добавление/удаление стран - придется обновлять поле для всех пользователей(главная проблема)
class MyUser(AbstractUser):
    perms = JSONField(default=lambda:{"us":"2000-01-01 00:00:00.00+00",
                                      "ru":"2000-01-01 00:00:00.00+00"})


Может, есть более оптимальные способы, которые я упускаю? А если нет, то какой из предложенных способов на ваш взгляд лучше или как их можно оптимизировать?

P.S. На данный момент 25 стран, пользователей ожидаю не больше 5-10к, сами запросы данных из базы страны довольно тяжелые.
  • Вопрос задан
  • 2795 просмотров
Пригласить эксперта
Ответы на вопрос 1
Tiendil
@Tiendil
Разработчик ПО.
Из представленных вариантов я бы выбрал 2. Проблемы с добавлением новых стран на самом деле нет — достаточно считать, что если страны нет в словаре. то ей соответствует какая-то, заданная по умолчанию, дата. Усложнения логики проверки тоже не вижу.

Почему нет варианта простой модели вида [user_id, country, date]? Удобно делать проверки и выборки.

>пользователей ожидаю не больше 5-10к
За какой период времени? Надо смотреть пиковые нагрузки.
Если это общее число, то скорее всего вообще не надо переживать по поводу нагрузки, а делать как удобно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы