Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Любое программное обеспечение разрабатывается под конкретную предметную область, например, система аналитики оперирует понятиями "просмотр", "сессия", "воронка", "когорта", а интернет-магазин — "товар", "категория", "платёжный шлюз". Все вместе они составляют онтологию предметной области (говорят модель предметной области). Кроме самих понятий онтология содержит и описание их связей. Например, сущность "Пользователь" связана с сущностью "Покупка" как "один ко многим". То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.

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

ERD

Важно понимать, что модель на то и модель, что она отражает лишь часть предметной области с некоторой детализацией. Причём, в программах из одной области, но от разных производителей, модель может быть разной. Конечно же, в таких областях, как бухгалтерия, есть некоторый набор фиксированных сущностей, их связей и правил работы, но есть и те вещи, где возможны вариации. В менее формальных областях таких возможностей ещё больше.

Приведу несколько примеров из Хекслета. Количество сущностей — больше сотни, количество связей — много сотен, количество правил посчитать сложно, их тоже много.

На основе модели предметной области формируется модель данных в коде. Создаются сущности, определяются их связи. Затем строится рабочий код, который оперирует сущностями, исходя из требований (бизнес-правил). На этом этапе возникает вопрос: а как эти сущности отображаются (от англ. "mapping" — "отображение") на базу данных, ведь именно там в конечном итоге всё хранится.

Самый простой вариант — создавать по таблице на каждую сущность и связывать их через внешние ключи. Именно так и делают в большинстве проектов, но не руками, а используя ORM (object-relation mapper). По сути, ORM — фреймворк для данных. С помощью него описываются сущности и их связи, определяется то, как сущность отображается на базу данных (как правило в полуавтоматическом режиме). ORM берет на себя серьёзную часть работы по генерации SQL-запросов, по извлечению данных и кастингу (casting, преобразование типов базы данных в типы целевого языка и обратно), по автоматическому извлечению связей. В итоге получается, что ORM прячет всю работу с базой данных (требуя только правильного конфигурирования) и сам выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но, как минимум, ORM содержат в себе query builder, который упрощает генерацию SQL.

В экосистеме Python таких ORM существует несколько, некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними. Другие вполне самостоятельны. Рассмотрим на пример, реализованный с использованием Django ORM.

Определение сущности Photo:

from django.db import models

class Photo(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField()
    slug = models.SlugField()

Использование:

# получаем объекты из базы
photos = Photo.objects.all()
# передаём их в шаблон
render(request, 'polls/detail.html', {'photos': photos})

Код, описывающий сущность, может показаться простым, однако степень автоматизации в Django ORM очень велика — под капотом у такого простого кода скрыты и создание сущности в БД, и целый набор проверок тех значений, которые вы помещаете в модель. По хорошему, перед тем как начинать работать с ORM, нужно сначала научиться основам баз данных. Причём не через программирование, а через прямую работу с базой. Познакомиться с понятием нормализации, внешними и первичными ключами, индексами, планом запроса и научиться работать с SQL как для изменения структуры базы данных, так и для манипулирования данными внутри базы. Затем перейти на уровень выполнения запросов из языка программирования (в Python для этого используется различные библиотеки вроде postgres). И только затем переходить к ORM. Всё это будет далее в курсах.

Вот лишь некоторые темы, вовлечённые в код выше:

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →