Проектирование и нормализация баз данных в 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 таблицы: ученик и предмет/класс.
В реальном мире у вас, скорее всего, будет гораздо больше информации о предмете (уровень, продолжительность и т.д.), поэтому у вас будет таблица студентов, таблица предметов и таблица пересечений, содержащая оценку, дату присвоения и т.д.