Skip to content

Instantly share code, notes, and snippets.

@pelid
Last active August 27, 2024 09:07
Show Gist options
  • Select an option

  • Save pelid/0d9024e24e3b303bafe6af994f35d17b to your computer and use it in GitHub Desktop.

Select an option

Save pelid/0d9024e24e3b303bafe6af994f35d17b to your computer and use it in GitHub Desktop.

Пробема: События бывают разных типов с разной полезкой инфой по ним VS Хотим общую таблицу событий

Вариант 1. Сделать в таблице кучу колонок, чтобы хватило всем типам событий.

Каждому типу события -- свой набор колонок.

Все колонки будут опциональными, почти все -- пустыми.

Вариант 2. Отказаться от реляции, хранить вариативную часть данных в виде JSON вместо ForeignKey, GenericForeignKey

Вариант 3. В событии сразу хранить готовую к отображению надпись

  • Не даст реализовать уведомления
  • Мультиязычность невозможно реализовать
  • Крайне ограничены возможности UX
  • Крайне трудно перерендерить старые HTML

Вариант 4. Multitable Inheritance

  • Для каждого типа событий с набором доп.данных -- своя таблица
  • Потенциально много запросов к БД для рендера списка

Вариант 5. Агрегировать инфу из нескольких независимых таблиц по дате

Придётся некоторые запросы писать на SQL, чтобы избежать больго количества запросов к БД

Вариант 6. Хранить события не в PostgreSQL, а в Redis, MongoDB, ещё где-то

class Event(models.Model):
event_type = CharField(..., choices=...,)
related_to = GenericForeignKey(...)
note = TextField(...)
note_author = ForeignKey(...)
docs = ...
# Вариант 2
class Event(models.Model):
event_typ
related_to = GenericForeignKey(...)
registered_at = models.DateTimeField(....)
payload = JSONField(...)
class Event(models.Model):
event_type = CharField(..., choices=...,)
related_to = GenericForeignKey(...)
registered_at = models.DateTimeField(....)
html = TextField(...)
class Event(models.Model):
related_to = GenericForeignKey(...) # ссылка на сделку #5
registered_at = models.DateTimeField(....)
class NoteCreatedEvent(Event):
author = models.ForeignKey(...)
text = ...
documents = ...
class DocsEvent(Event):
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment