0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Любое программное обеспечение разрабатывается под конкретную предметную область, например, система аналитики оперирует понятиями "просмотр", "сессия", "воронка", "когорта", а интернет-магазин - "товар", "категория", "платежный шлюз". Все вместе они составляют<a>онтологию предметной области</a>(говорят модель предметной области). Кроме самих понятий онтология содержит и описание их связей. Например, сущность "Пользователь" связана с сущностью "Покупка" как "один ко многим". То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.</p>
1
<p>Любое программное обеспечение разрабатывается под конкретную предметную область, например, система аналитики оперирует понятиями "просмотр", "сессия", "воронка", "когорта", а интернет-магазин - "товар", "категория", "платежный шлюз". Все вместе они составляют<a>онтологию предметной области</a>(говорят модель предметной области). Кроме самих понятий онтология содержит и описание их связей. Например, сущность "Пользователь" связана с сущностью "Покупка" как "один ко многим". То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.</p>
2
<p>Модель предметной области - основа коммуникации и взаимопонимания между членами команды. Она не зависит ни от языка программирования, ни от программирования вообще. Не важно кто общается: программисты между собой или программисты с заказчиками, менеджерами или дизайнерами. Все вместе они оперируют<strong>сущностями</strong>и<strong>связями</strong>предметной области и<strong>бизнес-правилами</strong>, используемыми в данной программе. К таким правилам может относиться автоматическое включение скидки при заказе от определенного объема товаров.</p>
2
<p>Модель предметной области - основа коммуникации и взаимопонимания между членами команды. Она не зависит ни от языка программирования, ни от программирования вообще. Не важно кто общается: программисты между собой или программисты с заказчиками, менеджерами или дизайнерами. Все вместе они оперируют<strong>сущностями</strong>и<strong>связями</strong>предметной области и<strong>бизнес-правилами</strong>, используемыми в данной программе. К таким правилам может относиться автоматическое включение скидки при заказе от определенного объема товаров.</p>
3
<p>Важно понимать, что модель на то и модель, что она отражает лишь часть предметной области с некоторой детализацией. Причем, в программах из одной области, но от разных производителей, модель может быть разной. Конечно же, в таких областях, как бухгалтерия, есть некоторый набор фиксированных сущностей, их связей и правил работы, но есть и те вещи, где возможны вариации. В менее формальных областях таких возможностей еще больше.</p>
3
<p>Важно понимать, что модель на то и модель, что она отражает лишь часть предметной области с некоторой детализацией. Причем, в программах из одной области, но от разных производителей, модель может быть разной. Конечно же, в таких областях, как бухгалтерия, есть некоторый набор фиксированных сущностей, их связей и правил работы, но есть и те вещи, где возможны вариации. В менее формальных областях таких возможностей еще больше.</p>
4
<p>Приведу несколько примеров из Хекслета. Количество сущностей - больше сотни, количество связей - много сотен, количество правил посчитать сложно, их тоже много.</p>
4
<p>Приведу несколько примеров из Хекслета. Количество сущностей - больше сотни, количество связей - много сотен, количество правил посчитать сложно, их тоже много.</p>
5
<p>На основе модели предметной области формируется модель данных в коде. Создаются сущности, определяются их связи. Затем строится рабочий код, который оперирует сущностями, исходя из требований (бизнес-правил). На этом этапе возникает вопрос: а как эти сущности отображаются ("мапятся" от англ. "map") на базу данных, ведь именно там в конечном итоге все хранится.</p>
5
<p>На основе модели предметной области формируется модель данных в коде. Создаются сущности, определяются их связи. Затем строится рабочий код, который оперирует сущностями, исходя из требований (бизнес-правил). На этом этапе возникает вопрос: а как эти сущности отображаются ("мапятся" от англ. "map") на базу данных, ведь именно там в конечном итоге все хранится.</p>
6
<p>Самый простой вариант - создавать по таблице на каждую сущность и связывать их через внешние ключи. Именно так и делают в большинстве проектов, но не руками, а используя<strong>ORM</strong>(object-relation mapper). По сути, ORM - фреймворк для данных. С помощью него описываются сущности и их связи, определяется то, как сущность отображается на базу данных (как правило, в полуавтоматическом режиме). ORM берет на себя серьезную часть работы по генерации SQL-запросов, по извлечению данных и кастингу (преобразование типов базы данных в типы целевого языка и обратно), по автоматическому извлечению связей. В итоге получается, что ORM прячет всю работу с базой данных (требуя только правильного конфигурирования) и сама выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но, как минимум, ORM содержат в себе query builder, который упрощает генерацию sql.</p>
6
<p>Самый простой вариант - создавать по таблице на каждую сущность и связывать их через внешние ключи. Именно так и делают в большинстве проектов, но не руками, а используя<strong>ORM</strong>(object-relation mapper). По сути, ORM - фреймворк для данных. С помощью него описываются сущности и их связи, определяется то, как сущность отображается на базу данных (как правило, в полуавтоматическом режиме). ORM берет на себя серьезную часть работы по генерации SQL-запросов, по извлечению данных и кастингу (преобразование типов базы данных в типы целевого языка и обратно), по автоматическому извлечению связей. В итоге получается, что ORM прячет всю работу с базой данных (требуя только правильного конфигурирования) и сама выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но, как минимум, ORM содержат в себе query builder, который упрощает генерацию sql.</p>
7
<p>В php таких ORM довольно много, некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними. Посмотрим на пример с фреймворком Doctrine2.</p>
7
<p>В php таких ORM довольно много, некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними. Посмотрим на пример с фреймворком Doctrine2.</p>
8
<p>Определение сущности Photo:</p>
8
<p>Определение сущности Photo:</p>
9
<p>Использование:</p>
9
<p>Использование:</p>
10
<p>Сказать, что описанное выше сложно для новичка - ничего не сказать. Перед работой с ORM нужно сначала научиться основам баз данных. Причем не через программирование, а через прямую работу с базой. Познакомиться с понятием нормализации, внешними и первичными ключами, индексами, планом запроса и научиться работать с sql как для изменения структуры базы данных, так и для манипулирования данными внутри базы. Затем перейти на уровень выполнения запросов из языка программирования. В php для этого используется библиотека PDO. И только затем переходить к ORM. Все это будет далее в курсах.</p>
10
<p>Сказать, что описанное выше сложно для новичка - ничего не сказать. Перед работой с ORM нужно сначала научиться основам баз данных. Причем не через программирование, а через прямую работу с базой. Познакомиться с понятием нормализации, внешними и первичными ключами, индексами, планом запроса и научиться работать с sql как для изменения структуры базы данных, так и для манипулирования данными внутри базы. Затем перейти на уровень выполнения запросов из языка программирования. В php для этого используется библиотека PDO. И только затем переходить к ORM. Все это будет далее в курсах.</p>
11
<p>Вот лишь некоторые темы, вовлеченные в код выше:</p>
11
<p>Вот лишь некоторые темы, вовлеченные в код выше:</p>
12
<ul><li><a>Entity-relation model</a></li>
12
<ul><li><a>Entity-relation model</a></li>
13
<li><a>Domain-driven design</a></li>
13
<li><a>Domain-driven design</a></li>
14
<li>ActiveRecord/DataMapper</li>
14
<li>ActiveRecord/DataMapper</li>
15
<li>Identity map/Unit of Work/Dirty</li>
15
<li>Identity map/Unit of Work/Dirty</li>
16
<li>Миграции</li>
16
<li>Миграции</li>
17
<li>Валидация</li>
17
<li>Валидация</li>
18
<li>Мета-программирование</li>
18
<li>Мета-программирование</li>
19
</ul>
19
</ul>