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