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