Задать вопрос
nykakdelishki
@nykakdelishki
Системный аналитик

Как реализовать зачет урока в реляционной базе данных?

Пытаюсь понять как устроена база данных в сервисе Duolingo, и делаю их ER.
Дуолинго это сервис где пользователь проходит уроки по выбранному языку(курсу)(например русский-английский).
Пример как выглядит это в дуолинго:
64b0f0bd4cbee066121546.png

Проблема у меня в том что не понятно как хранить состояние конкретного пользователя, чтоб это еще было юзабельно.
Я сделал примерную ЕР как мне кажется оно должно выглядеть:
64b0f25f8c0f9072230020.png
Выглядит очень страшно, и четкое ощущение что должно выглядеть более элегантно.

Но у этого решения есть проблема:
Как эффективно и быстро доставать статус топика конкретного пользователя(в примере "Урок 5 из 6"), Каждый раз считать? Это ж самоубийство.

Вопрос в том, как правильно хранить такие данные, чтобы это работало быстро и эффективно в условиях реляционной базы данных?
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Все уровни выше users_on_lessons называются денормализацией - хранить эти данные необязательно, их можно вычислить из других по цепочке связей.
"Правильно" в данном случае не существует, вы выбираете на каждом конкретном проекте между скоростью и консистентностью. Храните денормализованные данные? Тогда придётся обеспечивать их связность, чтобы не оказалось, что в users_on_lessons пользователь привязан к одному топику, а в users_on_topics к другому. Храните только "жёсткие" данные? Тогда будьте готовы считать нужное.

Я в данном случае не вижу необходимости в денормализации в том виде, в котором вы её реализовали. Курсов относительно немного (а пользователь всегда работает только с одним из них в момент времени), в каждом курсе относительно немного глав, в главе немного топиков, в топике немного уроков. Посчитать по уроку где там пользователь в этом дереве совсем не сложно прямо на клиенте, а ведь ещё у нас есть возможность кешировать данные.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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