Проектирование базы данных

Слева одна большая таблица с повторяющимися данными, справа две аккуратные таблицы, связанные по общему полю

Когда я запускал свою онлайн-школу, список учеников я вёл в одном длинном листе Excel. Строка — один ученик: имя, телефон, а рядом название группы, имя куратора и адрес филиала. Пока учеников было десять, всё держалось. Потом филиал переехал. Новый адрес я вписал в первые строки, отвлёкся на звонок, вернулся — и половина списка осталась со старым адресом. Один человек приехал не туда. Дело было не в невнимательности. Один и тот же адрес лежал у меня в сорока строках сразу, и я физически не мог поправить их все без ошибки. Проектирование базы данных — это как заранее разложить сведения так, чтобы адрес филиала хранился в одном месте, а не в сорока.

После урока сможешь:
— объяснить, почему сведения не сваливают в одну таблицу, и показать это на примере повторов;
— выбрать ключевое поле для таблицы и объяснить, почему фамилия для этого не годится;
— связать две таблицы по общему полю и опознать тип связи «один-ко-многим»;
— спроектировать простую таблицу с нуля по понятному порядку действий.

Вспомни, прежде чем начать. Пригодятся три вещи из прошлых уроков. Типы данных — текстовый, числовой, дата, логический — разбирали в уроке 2.5 «Типы данных». Что такое таблица, запись и поле — в уроке 2.6 «Объекты базы данных». А связь между таблицами и три модели данных — в уроке 2.7 «Модели данных».

Почему нельзя всё свалить в одну таблицу

Соблазн понятный: одна таблица — всё видно сразу, ничего не связываешь. Но как только у объектов появляются общие сведения, они начинают повторяться. Каждый студент группы ПИ-11 тянет за собой имя куратора и адрес корпуса. Двадцать пять студентов — двадцать пять копий одного и того же адреса. И вот тут начинается беда: адрес поменялся, а ты правишь его в двадцати пяти строках руками. Пропустил одну — и в базе одновременно живут два разных адреса одной группы. Какой из них верный, программа не знает.

ПЛОХО — всё в одной таблице (адрес группы повторяется):

Студент      Группа   Куратор       Адрес корпуса
──────────────────────────────────────────────────────
Орлов А.     ПИ-11    Смирнова Н.П.  ул. Мира, 3
Белова К.    ПИ-11    Смирнова Н.П.  ул. Мира, 3   ← повтор
Гусев Р.     ПИ-11    Смирнова Н.П.  ул. Мира, 3   ← повтор
Зайцев Д.    ПИ-12    Котов В.А.     пр. Ленина, 7

Сменился адрес ПИ-11 — правишь три строки. Забыл одну — данные врут.


ХОРОШО — две таблицы, связанные по номеру группы:

 Таблица «Группы»                 Таблица «Студенты»
 ─────────────────────────        ─────────────────────
 Группа  Куратор    Адрес         Студент     Группа
 ПИ-11   Смирнова   Мира, 3       Орлов А.    ПИ-11
 ПИ-12   Котов      Ленина, 7     Белова К.   ПИ-11
                                  Гусев Р.    ПИ-11
                                  Зайцев Д.   ПИ-12

 Адрес ПИ-11 хранится ОДИН раз. Сменился — правишь одну ячейку.

Правая схема и есть результат проектирования. Сведения о группе (куратор, адрес) уехали в свою таблицу и лежат там по одному экземпляру. В таблице «Студенты» от группы остался только её номер — короткая ссылка. Меняешь адрес в одном месте, и он сразу верен для всех одногруппников.

Ключевое поле: чем одна запись отличается от всех

Чтобы связать таблицы и вообще отличать одну запись от другой, нужно поле, по которому запись опознаётся однозначно. Это ключевое поле, оно же первичный ключ: поле, значение которого уникально для каждой записи и ни у кого не повторяется. По ключу ты всегда попадаешь ровно в одну строку.

Отсюда понятно, почему фамилия — плохой ключ. В одной группе легко встретятся два Кузнецова, а на потоке — десяток. Ключ обязан быть разным у всех, а фамилии совпадают. Номер зачётной книжки — наоборот, хороший ключ: у каждого студента он свой, и два одинаковых номера не выдают в принципе. Тот же смысл у номера паспорта, ИНН, инвентарного номера — это специально придуманные не совпадающие обозначения.

Связь таблиц: одна группа — много студентов

Таблицы связывают по совпадающему полю: в обеих есть номер группы, по нему база и понимает, кто к кому относится. Самый частый тип связи — один-ко-многим. Читается с двух сторон: одной группе принадлежит много студентов, а каждый студент числится только в одной группе. Одна запись слева — несколько записей справа.

СВЯЗЬ ОДИН-КО-МНОГИМ

  Таблица «Группы»            Таблица «Студенты»
  (сторона «один»)            (сторона «многие»)

  ┌─────────┐                 ┌──────────┬────────┐
  │ Группа  │                 │ Студент  │ Группа │
  ├─────────┤                 ├──────────┼────────┤
  │ ПИ-11   │◄────────────────│ Орлов    │ ПИ-11  │
  │ ПИ-12   │◄──┐         ┌───│ Белова   │ ПИ-11  │
  └─────────┘   │         ├───│ Гусев    │ ПИ-11  │
                └─────────┼───│ Зайцев   │ ПИ-12  │
                          └───└──────────┴────────┘

  Одна группа — много студентов.
  Поле «Группа» в таблице «Студенты» — внешнее поле-ссылка:
  оно указывает на ключевое поле таблицы «Группы».

Поле «Группа» внутри таблицы «Студенты» называют внешним полем-ссылкой. Само по себе оно не хранит адрес и куратора — оно лишь указывает, в какой строке таблицы «Группы» это всё лежит. Запомни сторону: ссылка всегда стоит там, где «многие», то есть в таблице «Студенты». Именно поэтому одно значение «ПИ-11» спокойно повторяется в строках студентов — это не дублирование сведений, а короткий указатель на единственную запись группы.

Порядок работы: с чего начать проектирование

Проектируют не наугад, а по шагам:
1. Определи, о каких объектах ты хранишь сведения (студенты, группы, книги, заказы).
2. Заведи на каждый объект свою таблицу.
3. Для каждой таблицы определи поля и их типы данных (из урока 2.5).
4. Выбери ключевое поле — то, что уникально для каждой записи.
5. Свяжи таблицы по общему полю.

И одно правило, которое держит всю картину без заумных слов: одна таблица — про один объект, а повторяющиеся сведения выносим в отдельную таблицу. Заметил, что одни и те же данные копируются из строки в строку, — это сигнал, что они на самом деле про другой объект и им нужна своя таблица.

Как это спрашивают на экзамене. Дают описание таблицы: «В таблице „Студенты“ есть поля Фамилия, Имя, Номер зачётки, Группа. Какое поле можно назначить ключевым?» — и просят выбрать одно. Верный ответ — поле, где значения не повторяются ни у кого, то есть номер зачётки. Второй частый вопрос: показывают две таблицы и спрашивают тип связи. «Один-ко-многим» узнаётся по тому, что одной записи в первой таблице соответствует несколько записей во второй.

Контрольный вопрос. Ключевое поле (первичный ключ) таблицы — это поле, значение которого …

Ауникально для каждой записи и не повторяется
Бодинаково у всех записей таблицы
Вобязательно должно быть текстовым
Гвсегда стоит в таблице первым слева

Подсказка: Ключ должен различать записи между собой. Если у двух строк значение совпадает — как ты их отличишь?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Почему фамилия — плохой выбор для ключевого поля таблицы «Студенты»?

Афамилии могут повторяться: у двух студентов бывает одинаковая фамилия
Бфамилию вообще нельзя хранить в базе данных
Вфамилия занимает слишком много места
Гфамилия меняется каждый семестр

Подсказка: Представь двух Кузнецовых в одной группе. Сможешь ли ты различить их по этому полю?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Как одним словом называется поле, значение которого уникально для каждой записи и служит для её опознания? Впиши прилагательное («… поле»).

Подсказка: Ищи поле, по которому можно однозначно отличить одну запись от всех остальных.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Почему номер зачётной книжки — хороший ключ для таблицы «Студенты»?

Аон уникален: у каждого студента свой номер, и два номера не совпадают
Бон короче фамилии и его удобнее печатать
Вего легче всего запомнить наизусть
Гон всегда состоит только из цифр

Подсказка: Хороший ключ различает всех. Спроси себя: могут ли у двух разных студентов совпасть эти номера?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Одной группе принадлежит много студентов, а каждый студент числится только в одной группе. Как называется такой тип связи между таблицами?

Аодин-ко-многим
Бодин-к-одному
Вмногие-ко-многим
Гникак не называется, это не связь

Подсказка: Прочитай связь с двух сторон: со стороны группы студентов много, со стороны студента группа одна.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Отметь все верные утверждения о проектировании базы данных (не менее двух вариантов).

Выберите все верные варианты.

Аодна таблица должна хранить сведения об одном виде объектов
Бповторяющиеся сведения выносят в отдельную таблицу
Ву таблицы должно быть ключевое поле
Гчем больше повторов в таблице, тем надёжнее данные
Дфамилия — лучший ключ, потому что она есть у всех

Подсказка: Два утверждения противоречат уроку: подумай, помогают ли повторы делу и годится ли фамилия в ключи.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. В связке «Группы» — «Студенты» поле «Номер группы» повторяется у студентов и указывает на нужную группу. В какой таблице это поле является внешним полем-ссылкой?

Ав таблице «Студенты»
Бв таблице «Группы»
Вв обеих таблицах одинаково
Гни в одной, ссылок в базах данных не бывает

Подсказка: Ссылка стоит на стороне «многие» — там, где несколько записей указывают на одну.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Для таблицы «Студенты» нужно выбрать ключевое поле. В поле «Фамилия» есть два «Кузнецова», в поле «Год рождения» многие значения совпадают, в поле «Номер студенческого билета» все значения разные, в поле «Группа» значения повторяются. Какое поле годится в ключи?

АНомер студенческого билета
БФамилия
ВГод рождения
ГГруппа

Подсказка: Ключ обязан быть разным у всех записей. Пройди по полям и найди то, где нет ни одного совпадения.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. В таблице «Заказы» в каждой из 500 строк рядом с товаром записаны название магазина, его адрес и телефон, и эти сведения повторяются сотни раз. Магазин сменил телефон. В чём главная проблема такого устройства таблицы?

Аодин и тот же телефон хранится в сотнях строк, и при смене легко исправить не все
Бтаблица начинает занимать слишком мало места
Взаказы в такой таблице нельзя отсортировать
Гназвание товара обязательно записано с ошибкой

Подсказка: Вернись к истории про адрес филиала в начале урока: что случается, когда одно значение лежит в куче строк сразу?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Нужно хранить сведения о преподавателях и о кафедрах: каждый преподаватель работает на одной кафедре, а на кафедре — много преподавателей. По правилу «одна таблица — про один объект», сколько таблиц ты заведёшь? Впиши число.

Подсказка: Посчитай, о скольких разных видах объектов идёт речь. На каждый вид — своя таблица.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. В таблице «Студенты» у каждого студента записан полный адрес его группы и ФИО куратора, и у одногруппников эти данные одинаковые. Что правильно сделать по правилу проектирования?

Авынести сведения о группе (адрес, куратор) в отдельную таблицу и связать по номеру группы
Будалить поле с адресом совсем, чтобы не мешало
Вдобавить ещё один столбец с адресом на всякий случай
Гоставить как есть, повторы работе не мешают

Подсказка: Повторяющиеся сведения — сигнал, что они про другой объект. Куда по правилу переезжает «другой объект»?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. У тебя таблица «Сотрудники» и таблица «Отделы». Каждый сотрудник работает в одном отделе, в отделе — много людей. Чтобы связать таблицы без повторения названия отдела в каждой строке, добавляют поле-ссылку. В какой из двух таблиц окажется это поле-ссылка? Впиши одно слово — название таблицы в именительном падеже.

Подсказка: Ссылка живёт на стороне «многие». Где записей больше — там, где по одному человеку в строке, или там, где по одному отделу?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Мини-проект. Спроектируй таблицу «Студенты» — на бумаге или в листе Excel. Access для этого не нужен.

Обязательные поля: фамилия, имя, дата рождения, номер группы, сдал ли зачёт. Добавь к ним своё ключевое поле — номер зачётки. Для каждого поля подпиши тип данных из урока 2.5 (например, текстовый, дата/время, числовой, логический). Сдай фото листа или файл с таблицей.

В поле ответа впиши число: сколько всего полей получилось в таблице.

Принято, если:
1) в таблице есть все пять названных полей и ключевое поле;
2) у каждого поля указан тип данных;
3) ключевое поле уникально для каждого студента, фамилия ключом не выбрана;
4) приложено фото или файл, по которому это видно.

Подсказка: Выпиши все поля в столбик, каждому подпиши тип данных из урока 2.5, и посчитай, сколько строк вышло в твоём списке. Не забудь про ключевое поле — его тоже добавляешь сам.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Итог.
— Сваливать всё в одну таблицу опасно: сведения повторяются, и при правке одного значения в десятках строк часть остаётся старой.
— Ключевое поле уникально для каждой записи. Номер зачётки годится, фамилия — нет: бывают однофамильцы.
— Таблицы связывают по общему полю. «Один-ко-многим» — это одна группа и много студентов; внешнее поле-ссылка стоит в таблице на стороне «многие».
— Порядок работы: объекты → таблица на каждый → поля и их типы → ключевое поле → связи. Правило: одна таблица — про один объект, повторы выносим отдельно.

← Назад · ↑ В начало урока · ⌂ В начало курса · Вперёд →

Школа Виктора Комлева