8) Короткие практические советы при проектировании
- Чётко определить, какие объекты данных будут храниться (например, Студенты, Курсы, Записи об обучении).
- Выбрать уникальные идентификаторы (первичные ключи) для каждой таблицы.
- Определить связи между таблицами через внешние ключи (FK).
- Определить минимальные необходимые атрибуты (не перегружать таблицу лишним, но держать достаточные данные для задач).
- Придерживаться 1NF: столбцы должны содержать атомарные значения (нет списков внутри одного поля).
9) Быстрый контрольный пример для закрепления
- Задание: спроектируйте табличную модель для школы с учениками, предметами и оценками.
- Ваши таблицы:
- Students(id, name, class)
- Courses(course_id, title)
- Enrollments(student_id, course_id, grade)
- Связи: EnrollmentsFKs связаны с Students.id и Courses.course_id.
- Пример данных:
- Students: (1, "Иванов", 9), (2, "Петрова", 9)
- Courses: (101, "Математика"), (102, "Информатика")
- Enrollments: (1, 101, 5), (1, 102, 4), (2, 101, 5)
10) Вопросы для самопроверки
- Что такое первичный ключ и зачем он нужен?
- Что такое внешний ключ и как он обеспечивает целостность данных?
- Какую таблицу использовать для хранения связей между учениками и курсами?
- Какие преимущества даёт табличная модель по сравнению с другими моделями хранения данных?
Ниже подробное решение и разбор по шагам, рассчитанные на учащихся средней школы. Мы не учитываем конкретный предмет или класс, используем общий подход к моделированию табличных баз данных.
1) Пошаговое объяснение дизайна табличной модели (для целей ПОНЯТЬ)
- Что мы проектируем
- Объекты данных: Студенты, Курсы, Записи об обучении (Enrollments), которые связывают студентов и курсы и могут содержать оценку.
- Как выбрать идентификаторы (первичные ключи)
- Для каждой таблицы выбираем уникальный идентификатор, который однозначно определяет запись.
- Примеры:
- Students: id
- Courses: course_id
- Enrollments: комбинация student_id и course_id (вместе они уникальны)
- Как определить связи между таблицами (внешние ключи)
- Таблица Enrollments должна ссылаться на Students и Courses.
- Это делается через внешние ключи:
- Enrollments.student_id → Students.id
- Enrollments.course_id → Courses.course_id
- Внешние ключи обеспечивают целостность: нельзя указать несуществующего студента или курс.
- Какие атрибуты держать (минимум, но достаточно)
- В каждой таблице хранить только необходимые данные:
- Students: id, name, class (напр., класс в школе)
- Courses: course_id, title
- Enrollments: student_id, course_id, grade
- Не перегружать таблицы лишними полями; если поле можно рассчитать или не нужно для задач — лучше не хранить.
- Принцип 1NF (первая норма нормализации)
- Ячейки таблицы должны содержать атомарные значения (нет списков внутри одного поля).
- Каждая колонка хранит одно значение, каждая строка — уникальная запись.
- Пример: в Enrollments у нас фиксированное сочетание student_id и course_id и атрибут grade, а не какая‑то группа значений в одном поле.
- Применение на практике (коротко)
- Определяем 3 таблицы и связи между ними.
- Добавляем ограничения целостности (первичные и внешние ключи).
- Проверяем данные на атомарность и отсутствие дубликатов по ключам.
2) Быстрый контрольный пример (для закрепления)
Задача: спроектируйте табличную модель для школы с учениками, предметами и оценками.
Ваши таблицы:
- Students(id, name, class)
- Courses(course_id, title)
- Enrollments(student_id, course_id, grade)
Связи:
- Enrollments FK на Students.id и Courses.course_id.
Пример данных (как в задаче):
- Students: (1, "Иванов", 9), (2, "Петрова", 9)
- Courses: (101, "Математика"), (102, "Информатика")
- Enrollments: (1, 101, 5), (1, 102, 4), (2, 101, 5)
Как это может выглядеть в виде SQL-реализации (для наглядности):
- Создание таблиц:
- CREATE TABLE Students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
class INT NOT NULL
);
- CREATE TABLE Courses (
course_id INT PRIMARY KEY,
title VARCHAR(100) NOT NULL
);
- CREATE TABLE Enrollments (
student_id INT,
course_id INT,
grade INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Students(id),
FOREIGN KEY (course_id) REFERENCES Courses(course_id)
);
- Вставка данных:
- INSERT INTO Students VALUES (1, 'Иванов', 9), (2, 'Петрова', 9);
- INSERT INTO Courses VALUES (101, 'Математика'), (102, 'Информатика');
- INSERT INTO Enrollments VALUES (1, 101, 5), (1, 102, 4), (2, 101, 5);
- Простой пример запроса: узнать, какие курсы и какие оценки у каждого студента
- SELECT s.name, c.title, e.grade
FROM Enrollments e
JOIN Students s ON e.student_id = s.id
JOIN Courses c ON e.course_id = c.course_id
ORDER BY s.id, c.course_id;
- Что можно проверить по этому примеру
- Целостность: каждый enrollment ссылается на существующего студента и существующий курс.
- 1NF: в таблицах каждое поле содержит одно значение (например, grade — оценка, а не список).
3) Вопросы для самопроверки (и ответы)
- Что такое первичный ключ и зачем он нужен?
- Это уникальный идентификатор каждой записи в таблице. Он нужен, чтобы точно отличать одну запись от другой, ускорять поиск и обеспечивать целостность данных (одна запись — один идентификатор).
- Что такое внешний ключ и как он обеспечивает целостность данных?
- Внешний ключ — ссылка на первичный ключ другой таблицы. Он обеспечивает целостность за счёт ограничений: нельзя вставить значение внешнего ключа, которого нет в целевой таблице; можно настроить каскадное удаление/обновление при удалении/изменении связанных записей.
- Какую таблицу использовать для хранения связей между учениками и курсами?
- Таблицу Enrollments (или аналогичную таблицу-связку). Это «таблица-связь» (junction table), которая хранит пары студент–курс и обычно дополнительное поле (например, grade).
- Какие преимущества даёт табличная модель по сравнению с другими моделями хранения данных?
- Гибкость: легко добавлять новые курсы, студентов и связи без изменения схемы.
- Целостность данных: можно явно задать ключи и ограничения, чтобы данные не противоречили друг другу.
- Нормализация: данные не дублируются и легко обновляются.
- Модульность и расширяемость: можно легко расширять модель (добавлять новые атрибуты, роли, семестры и т. д.).
- Эффективность запросов: с правильными индексами и связями можно быстро получать нужную информацию через JOIN.
Если хотите, могу привести дополнительные примеры запросов (например, средний балл по студенту, список студентов на курсе и т. д.) или адаптировать решение под конкретные параметры класса или предмета.