До сих пор таблицы появлялись в уроках готовыми: вот students, вот grades. Но откуда они берутся? Кто решил, что оценки лежат отдельно от студентов, а не в той же таблице? Этот урок открывает серию о проектировании. Прежде чем писать CREATE TABLE, базу рисуют на бумаге, и у этого рисунка есть свой язык: ER-модель.
Чертёж до стройки
Дом не строят с первого кирпича. Сначала архитектор рисует план: комнаты, двери между ними, где кухня, а где спальня. На плане нет марки цемента и толщины проводов, зато по нему видно, что из спальни в ванную нельзя пройти, не выходя в коридор. Ошибку на чертеже исправить стоит ластика, ошибку в построенном доме стоит ремонта.
С базами то же самое. Переименовать прямоугольник на бумаге легко, а переделать таблицу с миллионом строк, на которую ссылаются ещё пять таблиц, долго и страшно. Поэтому сначала рисуют ER-модель, от английского entity-relationship, «сущность-связь». Её предложил Питер Чен в 1976 году, и с тех пор это главный чертёжный язык для баз данных.
В ER-модели три строительных блока: сущности, атрибуты и связи. Разберём их на примере онлайн-школы.
Сущности: о чём мы храним данные
Послушай, как владелец школы описывает свой бизнес: «У нас есть студенты, они записываются на курсы. Каждый курс ведёт преподаватель. Курс состоит из уроков». Существительные в этом рассказе это кандидаты в сущности.
Сущность это вид вещей, о которых база должна помнить: студент, курс, преподаватель. Конкретная студентка Аня это экземпляр сущности «студент». Сущность станет таблицей, экземпляр станет строкой.
Не каждое существительное становится сущностью. «Школа» в рассказе есть, но школа у нас одна, хранить о ней нечего. Хороший вопрос-фильтр: «у этой штуки бывает много экземпляров, и про каждый нужно что-то помнить?» Студентов много, и про каждого помним имя и почту, значит, это сущность.
На диаграмме сущность рисуют прямоугольником:
┌───────────┐ ┌───────────┐ ┌───────────────┐
│ Студент │ │ Курс │ │ Преподаватель │
└───────────┘ └───────────┘ └───────────────┘
Атрибуты: что мы о них помним
Атрибут это свойство сущности: у студента имя, почта и дата рождения, у курса название и цена. Атрибут станет колонкой.
Атрибуты бывают разных видов, и вид подсказывает, как их потом хранить:
- Ключевой. Однозначно определяет экземпляр, как почта студента. Это потенциальный ключ из урока про ключи. На диаграмме его подчёркивают.
- Составной. Делится на части: адрес состоит из города, улицы и дома. Если тебе понадобится искать студентов по городу, город должен быть отдельной частью.
- Многозначный. У одного экземпляра несколько значений: у студента бывает несколько телефонов. Помнишь правило «одно значение в клетке» из урока про отношения? Такой атрибут в одну колонку не ляжет, и в следующем уроке мы увидим, куда его девать.
- Производный. Вычисляется из других: возраст считается по дате рождения. Его обычно не хранят, иначе через год он соврёт.
┌───────────┐
email ────────┤ Студент ├──────── {телефон} (многозначный)
(ключевой) └─────┬─────┘
│
┌─────────────┼──────────────┐
имя дата рождения (возраст) (производный)
дальше после входа
Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.
Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.