Проектирование базы данных
Введено| English | Значение |
|---|---|
| relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ | реляционная база данных |
| tables/ˈteɪblz/ | таблицы |
| entities/ˈentɪtiz/ | сущности |
| primary key/ˈpraɪməri kiː/ | первичный ключ |
| foreign key/ˈfɒrən kiː/ | внешний ключ |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | нормализация |
В одном переименованном курсе теперь две названия
- Школа копирует название курса в каждую строку записи о зачислении. Переименование некоторых копий приводит к появлению двух противоречащих друг другу названий для одного и того же курса.
- Реляционная база данных хранит строки в таблицах. Сначала определите сущности, такие как студенты и курсы, и связи между ними.
Разделите идентификатор от изменяемой метки
- Первичный ключ уникально идентифицирует строку и не может быть пустым (NULL). Стабильный ID студента позволяет изменить имя, не меняя личность студента.
- Естественный ключ может работать, если его уникальность и стабильность гарантированы. Имя — плохой ключ здесь, так как у разных студентов оно может совпадать; электронная почта также может измениться.
Студенты могут иметь одинаковые имена и менять адреса электронной почты. Какой ключ является лучшим для этой схемы?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Выберите стабильную идентичность, а не метку, которая повторяется или меняется.
Представьте связь «многие ко многим»
- Один студент может посещать много курсов; один курс может иметь много студентов. Используйте таблицу зачислений с одной строкой для каждой пары студент–курс.
- Внешний ключ связывает каждую запись о зачислении с действующим ключом студента или курса. Составной первичный ключ
(student_id, course_id)предотвращает дублирование одной и той же пары.
Какая схема представляет студентов, посещающих множество курсов, и курсы, на которые записано много студентов?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Каждая запись о записи фиксирует одну пару студент–курс.
Какой ключ связывает запись о зачислении с существующим ключом курса?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Внешний ключ представляет и ограничивает эту ссылку при включенной проверке.
Какое ограничение предотвращает повторное появление одной и той же пары студент–курс?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Составной первичный ключ идентифицирует пару.
Храните факт о курсе вместе с курсом
- Нормализация организует таблицы на основе их зависимостей, чтобы уменьшить несогласованные повторения. В данном дизайне ID курса определяет его название, поэтому храните название в таблице курсов.
- Повторение значений внешних ключей ожидается: множество записей о зачислении могут ссылаться на один курс. Правило «никогда не повторяйте никаких значений» не является полезным правилом проектирования баз данных.
Повторение одного и того же ID курса в нескольких строках записей всегда является ошибкой нормализации.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Ожидаются повторяющиеся ссылки. Копирование названия курса в каждую строку связи вызывает проблему обновления здесь.
Включите и проверьте ограничения
- В SQLite включите принудительное выполнение внешних ключей для каждого соединения с помощью
PRAGMA foreign_keys = ONдо начала работы. Простого объявления связи недостаточно. - Проверьте валидную запись, дубликат пары и запись, ссылку на отсутствующий курс. Ограничения должны отклонить последние две; они не определяют, у кого из вызывающих сторон есть права доступа.
PRAGMA foreign_keys = ON;
CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (
student_id INTEGER REFERENCES students(id),
course_id INTEGER REFERENCES courses(id),
PRIMARY KEY (student_id, course_id),
CHECK (student_id IS NOT NULL AND course_id IS NOT NULL)
);
Объявление внешних ключей SQLite означает, что они проверяются на каждом подключении без их явного включения.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Включите PRAGMA foreign_keys = ON для каждого подключения и проверьте поведение.
Проверьте проект на новом примере
- Для библиотечных займов название книги не обязательно является уникальной физической копией. Определите заемщика, конкретную копию и событие займа перед выбором ключей.
- Решите, допускаются ли повторяющиеся события. Пара студент–курс может идентифицировать одну запись здесь, но пара заемщик–копия не позволяет различить повторные займы по разным датам.
Выберите ключи для нужной вам сущности. Разделите факты о сущностях от строк связей, затем проверьте уникальность и ограничения ссылок на конкретных примерах.
Предложите сущности и ключи для библиотеки, где читатель может брать один и тот же физический экземпляр более одного раза.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Используйте ID читателя, ID экземпляра и отдельную идентичность события займа с необходимыми деталями события.
Почему пары читатель–экземпляр недостаточны как ключ для повторных займов?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Ключ должен различать фактические события, которые нужно записать.