Как правильно спроектировать БД для чатов?

Пытаюсь сделать чаты, где люди могут общаться 1 на 1 или в группе:

64dde57ced518095399691.png

Первоначально в голову пришла такая мысль:
сделать общую модель Chat и для личных чатов и для групп
Просто в личном чате будет всего 2 участника
К тому же встречал данную идею в интернете, что придало убежденности в ее правильности
Вот сделал:

Модель Chat

class Chat(models.Model):
    class Type(models.TextChoices):
        PERSONAL = 'personal'
        GROUP = 'group'

    class Accessibility(models.TextChoices):
        PUBLIC = 'public'
        PRIVATE = 'private'


    type = models.CharField(
        verbose_name='Тип',
        max_length=15,
        choices=Type.choices,
    )
    accessibility = models.CharField(
        verbose_name='Доступность',
        max_length=15,
        choices=Accessibility.choices,
    )

    title = models.CharField(verbose_name='Заголовок', max_length=255, null=True)
    description = models.TextField(verbose_name='Описание', null=True)
    photo = FilerImageField(
        verbose_name='Фото',
        on_delete=models.SET_NULL,
        null=True,
    )
    members = models.ManyToManyField(
        verbose_name='Члены',
        to='users.User',
        through='Membership',
        related_name='chats',
    )



Проблемы, с которыми я не могу разобраться:
1. Много лишних полей: accessibility, title, description, photo нужны только для групповых чатов
Для личных чатов нужно только поле members (где будет только 2 пользователя) остальные NULL.
2. При получении списка чатов у личных чатов должна быть фотка 2-го пользователя и его имя, а также прочие атрибуты пользователя, а у групповых чатов отображаются поля из модели title и photo. Не получается эффективно извлечь список чатов с данными условиями.

Исходя из вышеперечисленных проблем мне кажется, что я двигаюсь не в правильном направлении
  • Вопрос задан
  • 335 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Тут будет действовать правило разработки NoSQL систем. Если вы хотите чтобы ваш чят быстро работал - вам надо все запросы сделать очень простыми. Тоесть никаких джойнов, группировок и подзапросов. Материализуйте
все запросы чтобы отдача данных была простой и примитивной.

Посмотрите как проектируются БД на основе Mongo, CouchDb, Cassandra. Посмотрите как используется NGinx.

Django/ORM здесь - это просто опция которая может быть или может не быть, но на успех мероприятия она
не влияет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Lastor
@Lastor
В чем сила, брат? В ньютонах.
Проблемы, с которыми я не могу разобраться:

У вас не возникало никаких проблем.
Вы занимаетесь преждевременной оптимизацией.
Ответ написан
Ваш ответ на вопрос

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

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