Проектирование и нормализация баз данных в django

У меня есть веб-форма, где студент может ввести свою информацию и оценки, например

  • Имя
  • Возраст
  • Математический класс
  • Испанский язык
  • Оценка по химии

Это преобразуется в POST-запрос, как показано ниже:

POST /grades
{
 "name": "Bob",
 "age": 17,
 "math_grade": "A",
 "spanish_grade": "B",
 "chemistry_grade": "C",
}

В конечном итоге, это будет храниться в SQL таблице grades, как показано ниже, с помощью django ORM:

Name Age Subject Grade
Bob 17 Math A
Bob 17 Spanish B
Bob 17 Chemistry C

Все хорошо до этого места.


Поскольку я читал о различных нормальных формах (1НФ, 2НФ, 3НФ), кажется, что приведенная выше таблица должна быть двумя таблицами (student и grades) или даже тремя (student, subject таблица DIMENSION, grades таблица FACT).

Q1. Если таблица grades действительно должна быть разделена, должен ли я сделать это на уровне приложения, где django ORM выполняет SQL-запрос к нескольким таблицам одновременно, или я предварительно оптимизирую здесь? Должен ли я сделать нормализацию как часть моей стратегии хранения данных и оставить таблицу приложения как есть?

Q2. Если я хочу вернуть оценки для Боба во вложенном формате, как показано ниже, как мне это сделать в django.

GET /grades/Bob
{
  "name": "Bob",
  "age": 17,
  "grades": {
     "math": "A",
     "spanish": "B",
     "chemistry": "C",
   }
}

Эти вопросы кажутся очевидными, но я не уверен, если/что я упускаю. Спасибо!

Размеры и факты - типы таблиц, используемые в аналитических (OLAP) системах, редко бывают в нормализованной форме.

Если вы рассматриваете создание транзакционной (OLTP) системы, то она обычно имеет формат 3NF. Если данные, которые вы показываете, - это действительно вся информация, которой вы располагаете, то оптимальным вариантом будет 2 таблицы: ученик и предмет/класс.

В реальном мире у вас, скорее всего, будет гораздо больше информации о предмете (уровень, продолжительность и т.д.), поэтому у вас будет таблица студентов, таблица предметов и таблица пересечений, содержащая оценку, дату присвоения и т.д.

Вернуться на верх