Что такое мультитенантность, какие бывают архитектуры и почему django-tenants использует PostgreSQL schemas.
Мультитенантность — это архитектурный паттерн, который позволяет одному приложению обслуживать множество клиентов с полной изоляцией их данных.
Мультитенантность (multitenancy) — это архитектура, при которой один экземпляр приложения обслуживает несколько клиентов (тенантов). Каждый тенант видит только свои данные и настройки, не зная о существовании других клиентов.
Типичный пример — SaaS-платформа вроде Trello, Asana или HubSpot. Каждая компания работает в своём пространстве, но все используют одно и то же приложение.
Представьте, что вы разрабатываете проектную платформу для компаний. У вас есть два пути:
Путь 1: Отдельный инстанс для каждого клиента
Проблемы:
Путь 2: Мультитенантное приложение
Преимущества:
Существует три основных подхода к изоляции данных:
Каждый тенант имеет свою базу данных.
┌─────────────┐
│ App │
├─────────────┤
│ DB: acme │
│ DB: globex │
│ DB: initech │
└─────────────┘
Плюсы:
Минусы:
Все тенанты в одной базе, в одной таблице. Разделение по полю tenant_id.
class Project(models.Model):
tenant_id = models.IntegerField()
name = models.CharField(max_length=100)┌──────────────────────────────────────┐
│ Table: projects │
├──────────────────────────────────────┤
│ id | tenant_id | name │
├──────────────────────────────────────┤
│ 1 | 1 | Acme Project │
│ 2 | 1 | Acme Another │
│ 3 | 2 | Globex Initiative │
└──────────────────────────────────────┘
Плюсы:
Минусы:
tenant_id в запросе)Каждый тенант имеет свою schema в одной базе данных PostgreSQL.
┌──────────────────────────────────────┐
│ Database: saas_platform │
├──────────────────────────────────────┤
│ Schema: public (общие данные) │
│ Schema: acme (данные Acme) │
│ Schema: globex (данные Globex) │
│ Schema: initech (данные Initech) │
└──────────────────────────────────────┘
Плюсы:
Минусы:
Библиотека django-tenants использует подход с изоляцией на уровне схем PostgreSQL. Это золотая середина между изоляцией отдельных БД и простотой общих таблиц.
acme.example.com django-tenants автоматически переключается на схему acmeacme# Запрос автоматически попадает в схему текущего тенанта
projects = Project.objects.all() # Видит только проекты Acmedjango-tenants использует Database Router для автоматической маршрутизации:
Запрос → Определение домена → Выбор схемы → Выполнение запроса
Вам не нужно вручную указывать схему — библиотека делает это автоматически на основе домена.
Модель, представляющая тенанта. Обычно называется Client:
from django_tenants.models import TenantMixin
class Client(TenantMixin):
name = models.CharField(max_length=100)
created_on = models.DateField(auto_now_add=True)Модель, связывающая домены с тенантами:
from django_tenants.models import DomainMixin
class Domain(DomainMixin):
# domain = 'acme.example.com' → tenant = Client(id=1)
passfrom django_tenants.models import SharedModel, TenantModel
class Plan(SharedModel): # Общие тарифы
name = models.CharField(max_length=100)
class Project(TenantModel): # Проекты конкретного тенанта
name = models.CharField(max_length=100)✅ Используйте, если:
❌ Не используйте, если:
В следующей теме вы научитесь устанавливать и настраивать django-tenants в вашем проекте.
Переходите к следующей теме → Установка и настройка django-tenants
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.