HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Чтобы овладеть принципами организации данных в реляционных базах, нужно не только знать формы нормализации и реляционную алгебру. Важно понимать смыслы, которые лежат вне области программирования.</p>
1 <p>Чтобы овладеть принципами организации данных в реляционных базах, нужно не только знать формы нормализации и реляционную алгебру. Важно понимать смыслы, которые лежат вне области программирования.</p>
2 <p>Программы, которые пишут программисты, всегда создаются под определенную предметную область. Например, бухгалтерский софт основывается на правилах ведения бухгалтерского учета, а сайт для просмотра сериалов - на таких понятиях из телеиндустрии, как "сезон" или "эпизод".</p>
2 <p>Программы, которые пишут программисты, всегда создаются под определенную предметную область. Например, бухгалтерский софт основывается на правилах ведения бухгалтерского учета, а сайт для просмотра сериалов - на таких понятиях из телеиндустрии, как "сезон" или "эпизод".</p>
3 <p>Понимать предметную область, для которой вы пишете программу, так же важно, как и уметь программировать. Иногда область может быть по-настоящему сложной, например, бухгалтерия или технологическое производство. Но общее понимание все же требуется.</p>
3 <p>Понимать предметную область, для которой вы пишете программу, так же важно, как и уметь программировать. Иногда область может быть по-настоящему сложной, например, бухгалтерия или технологическое производство. Но общее понимание все же требуется.</p>
4 <p>В этом уроке мы узнаем, что такое онтология и как она помогает описывать предметную область программы и показывать связи ее сущностей. В итоге мы разберем каждый тип связи и поймем, в каких случаях они будут полезны. Также рассмотрим, как эти связи визуализируются.</p>
4 <p>В этом уроке мы узнаем, что такое онтология и как она помогает описывать предметную область программы и показывать связи ее сущностей. В итоге мы разберем каждый тип связи и поймем, в каких случаях они будут полезны. Также рассмотрим, как эти связи визуализируются.</p>
5 <h2>Что такое онтология</h2>
5 <h2>Что такое онтология</h2>
6 <p>Рассмотрим Хекслет, так как вы с ним знакомы. Чтобы понимать предметную область Хекслета, нужно выделить ключевые понятия -<strong>сущности</strong>, вокруг которых строится вся логика. У обучающих ресурсов это, как правило, "курс" и "урок". Но на самом деле сущностей гораздо больше.</p>
6 <p>Рассмотрим Хекслет, так как вы с ним знакомы. Чтобы понимать предметную область Хекслета, нужно выделить ключевые понятия -<strong>сущности</strong>, вокруг которых строится вся логика. У обучающих ресурсов это, как правило, "курс" и "урок". Но на самом деле сущностей гораздо больше.</p>
7 <p>В случае Хекслета еще можно выделить "профессию", "испытание", "code review", "квиз", "участника курса", "проект". Этот список можно продолжать еще долго. Но сущности не существуют сами по себе, а находятся во взаимоотношениях друг с другом.</p>
7 <p>В случае Хекслета еще можно выделить "профессию", "испытание", "code review", "квиз", "участника курса", "проект". Этот список можно продолжать еще долго. Но сущности не существуют сами по себе, а находятся во взаимоотношениях друг с другом.</p>
8 <p>Например, квиз содержит или агрегирует в себе вопросы, в которых есть ответы. Профессия состоит из курсов, а курсы из уроков, уроки - из теории, квиза и практики. Эти связи имеют конкретные названия:</p>
8 <p>Например, квиз содержит или агрегирует в себе вопросы, в которых есть ответы. Профессия состоит из курсов, а курсы из уроков, уроки - из теории, квиза и практики. Эти связи имеют конкретные названия:</p>
9 <ul><li><p><strong>Один ко многим</strong>,<strong>one-to-many</strong>или<strong>o2m</strong>. Например, когда один урок может находиться только в одном курсе, но курс содержит множество уроков</p>
9 <ul><li><p><strong>Один ко многим</strong>,<strong>one-to-many</strong>или<strong>o2m</strong>. Например, когда один урок может находиться только в одном курсе, но курс содержит множество уроков</p>
10 </li>
10 </li>
11 <li><p><strong>Один к одному</strong>,<strong>one-to-one</strong>или<strong>o2o</strong>. Например, на Хекслете такая связь установлена между пользователем и аккаунтом на Facebook</p>
11 <li><p><strong>Один к одному</strong>,<strong>one-to-one</strong>или<strong>o2o</strong>. Например, на Хекслете такая связь установлена между пользователем и аккаунтом на Facebook</p>
12 </li>
12 </li>
13 <li><p><strong>Многие ко многим</strong>,<strong>many-to-many</strong>или<strong>m2m</strong>. Например, когда один курс могут проходить много пользователей, и один пользователь может проходить много курсов</p>
13 <li><p><strong>Многие ко многим</strong>,<strong>many-to-many</strong>или<strong>m2m</strong>. Например, когда один курс могут проходить много пользователей, и один пользователь может проходить много курсов</p>
14 </li>
14 </li>
15 </ul><p>Так это выглядит на схеме:</p>
15 </ul><p>Так это выглядит на схеме:</p>
16 <p>Описание объектов рассматриваемой области и связей между ними называется<strong>онтологией</strong>предметной области. Эту онтологию хорошо знают эксперты соответствующей области: в бухгалтерии - бухгалтер, в обучении - преподаватель. Но, в отличие от программистов, они часто представляют ее на интуитивном уровне, неформально.</p>
16 <p>Описание объектов рассматриваемой области и связей между ними называется<strong>онтологией</strong>предметной области. Эту онтологию хорошо знают эксперты соответствующей области: в бухгалтерии - бухгалтер, в обучении - преподаватель. Но, в отличие от программистов, они часто представляют ее на интуитивном уровне, неформально.</p>
17 <p>На практике программисты, бизнес-аналитики или менеджеры общаются с заказчиками, которые могут сами выступать в роли экспертов, и строят вместе с ними формальную онтологию. То есть выделяют конкретные термины, договариваются, что они означают и как связаны друг с другом.</p>
17 <p>На практике программисты, бизнес-аналитики или менеджеры общаются с заказчиками, которые могут сами выступать в роли экспертов, и строят вместе с ними формальную онтологию. То есть выделяют конкретные термины, договариваются, что они означают и как связаны друг с другом.</p>
18 <p>Затем с помощью<a>ER-модели</a>программист формирует необходимую модель данных. Необязательно на бумаге или в специализированных программах. Чаще такая модель существует только в голове и коде.</p>
18 <p>Затем с помощью<a>ER-модели</a>программист формирует необходимую модель данных. Необязательно на бумаге или в специализированных программах. Чаще такая модель существует только в голове и коде.</p>
19 <p>Эта модель и становится основной для проектирования базы данных. Каждая сущность в реляционной базе данных представлена таблицей, а связи между сущностями реализуются через внешние ключи.</p>
19 <p>Эта модель и становится основной для проектирования базы данных. Каждая сущность в реляционной базе данных представлена таблицей, а связи между сущностями реализуются через внешние ключи.</p>
20 <p>Чтобы визуализировать ER-модель, используют диаграмму Entity-Relationship Diagram (ERD). Познакомимся с ней.</p>
20 <p>Чтобы визуализировать ER-модель, используют диаграмму Entity-Relationship Diagram (ERD). Познакомимся с ней.</p>
21 <h2>Что такое ERD</h2>
21 <h2>Что такое ERD</h2>
22 <p>У ER-модели нет графического представления, поэтому используют ERD. Многие понимают под ER-моделью и ERD одно и то же. Хотя ER-модель можно представить и с помощью других нотаций.</p>
22 <p>У ER-модели нет графического представления, поэтому используют ERD. Многие понимают под ER-моделью и ERD одно и то же. Хотя ER-модель можно представить и с помощью других нотаций.</p>
23 <p>В ERD каждая сущность представлена блоком, в котором перечисляются поля. Между блоками рисуются линии, у которых есть некоторые заранее определенные концы. Они определяют тип связи между сущностями:</p>
23 <p>В ERD каждая сущность представлена блоком, в котором перечисляются поля. Между блоками рисуются линии, у которых есть некоторые заранее определенные концы. Они определяют тип связи между сущностями:</p>
24 <p>Рассмотрим подробнее каждый вид связи.</p>
24 <p>Рассмотрим подробнее каждый вид связи.</p>
25 <h3>Один ко многим (one-to-many)</h3>
25 <h3>Один ко многим (one-to-many)</h3>
26 <p>Один ко многим - наиболее распространенный вид связи. Например, один лектор может вести несколько курсов:</p>
26 <p>Один ко многим - наиболее распространенный вид связи. Например, один лектор может вести несколько курсов:</p>
27 <p>Технически, такая связь организуется через внешний ключ, который добавляется в зависимую сущность - many.</p>
27 <p>Технически, такая связь организуется через внешний ключ, который добавляется в зависимую сущность - many.</p>
28 <p>Допустим, у нас есть две исходные таблицы:</p>
28 <p>Допустим, у нас есть две исходные таблицы:</p>
29 <p><strong>users</strong></p>
29 <p><strong>users</strong></p>
30 <p><strong>emails</strong></p>
30 <p><strong>emails</strong></p>
31 <p>Чтобы узнать все адреса почты, которые есть у пользователя с идентификатором 1, нужно выполнить такой запрос:</p>
31 <p>Чтобы узнать все адреса почты, которые есть у пользователя с идентификатором 1, нужно выполнить такой запрос:</p>
32 <h3>Один к одному (one-to-one)</h3>
32 <h3>Один к одному (one-to-one)</h3>
33 <p>На схеме такая связь выглядит так:</p>
33 <p>На схеме такая связь выглядит так:</p>
34 <p>Например, у каждой страны есть одна столица:</p>
34 <p>Например, у каждой страны есть одна столица:</p>
35 <p><strong>countries</strong></p>
35 <p><strong>countries</strong></p>
36 <p><strong>cities</strong></p>
36 <p><strong>cities</strong></p>
37 <p>Связь one-to-one обычно существует не сама по себе, а внутри связи one-to-many. То есть у каждой страны есть города, но только один из них столица.</p>
37 <p>Связь one-to-one обычно существует не сама по себе, а внутри связи one-to-many. То есть у каждой страны есть города, но только один из них столица.</p>
38 <h3>Многие ко многим (many-to-many)</h3>
38 <h3>Многие ко многим (many-to-many)</h3>
39 <p>Такие связи можно отобразить так:</p>
39 <p>Такие связи можно отобразить так:</p>
40 <p>Многие ко многим встречается очень часто. Например, у каждого человека множество друзей, каждый человек друг для множества других. Или один человек проходит множество курсов, один курс проходится множеством людей.</p>
40 <p>Многие ко многим встречается очень часто. Например, у каждого человека множество друзей, каждый человек друг для множества других. Или один человек проходит множество курсов, один курс проходится множеством людей.</p>
41 <p>Эта связь реализуется уже не так просто. Технически невозможно связать две таблицы связью many-to-many без введения третьей таблицы.</p>
41 <p>Эта связь реализуется уже не так просто. Технически невозможно связать две таблицы связью many-to-many без введения третьей таблицы.</p>
42 <p>Например, у нас есть две исходные таблицы:</p>
42 <p>Например, у нас есть две исходные таблицы:</p>
43 <p><strong>users</strong></p>
43 <p><strong>users</strong></p>
44 <p><strong>courses</strong></p>
44 <p><strong>courses</strong></p>
45 <p>Эта таблица будет связующей:</p>
45 <p>Эта таблица будет связующей:</p>
46 <p><strong>course_members</strong></p>
46 <p><strong>course_members</strong></p>
47 <p>В таблице course_members есть свой первичный ключ, и каждая запись содержит ссылки как на конкретный курс, так и на конкретного пользователя. На Хекслете эта таблица начинает заполняться в тот момент, когда пользователь нажимает кнопку "Вступить в курс". Для юзера создается запись с его идентификатором и идентификатором курса, который он собрался проходить.</p>
47 <p>В таблице course_members есть свой первичный ключ, и каждая запись содержит ссылки как на конкретный курс, так и на конкретного пользователя. На Хекслете эта таблица начинает заполняться в тот момент, когда пользователь нажимает кнопку "Вступить в курс". Для юзера создается запись с его идентификатором и идентификатором курса, который он собрался проходить.</p>
48 <p>Если мы захотим узнать все курсы, которые проходит пользователь, то выполним такой запрос:</p>
48 <p>Если мы захотим узнать все курсы, которые проходит пользователь, то выполним такой запрос:</p>
49 <p>Если захотим узнать, кто проходит данный курс, то такой запрос:</p>
49 <p>Если захотим узнать, кто проходит данный курс, то такой запрос:</p>
50 <p>Такая структура соблюдается для любых двух сущностей, которые надо связать. В общем виде схема выглядит так:</p>
50 <p>Такая структура соблюдается для любых двух сущностей, которые надо связать. В общем виде схема выглядит так:</p>
51 <p>Есть исходные таблицы<em>A</em>и<em>B</em>. Для них создается новая таблица<em>AB</em>. Внутри нее есть два внешних ключа -<em>a_id</em>и<em>b_id</em>, которые связаны с исходными таблицами.</p>
51 <p>Есть исходные таблицы<em>A</em>и<em>B</em>. Для них создается новая таблица<em>AB</em>. Внутри нее есть два внешних ключа -<em>a_id</em>и<em>b_id</em>, которые связаны с исходными таблицами.</p>
52 <p>Как показывает практика, такая промежуточная таблица часто становится самостоятельной сущностью. Если брать курсы, то важно понимать, закончил ли пользователь курс или нет, когда конкретно он это сделал, сколько заданий решил. Вся эта информация может храниться только в одном месте - в связанной таблице.</p>
52 <p>Как показывает практика, такая промежуточная таблица часто становится самостоятельной сущностью. Если брать курсы, то важно понимать, закончил ли пользователь курс или нет, когда конкретно он это сделал, сколько заданий решил. Вся эта информация может храниться только в одном месте - в связанной таблице.</p>
53 <h2>Выводы</h2>
53 <h2>Выводы</h2>
54 <p>В этом уроке мы узнали, что онтология помогает описывать предметную область программы и показывать связи ее сущностей. В реляционных базах данных используют три типа связи: один ко многим, один к одному и многие ко многим. А визуализируются они с помощью Entity-Relationship Diagram.</p>
54 <p>В этом уроке мы узнали, что онтология помогает описывать предметную область программы и показывать связи ее сущностей. В реляционных базах данных используют три типа связи: один ко многим, один к одному и многие ко многим. А визуализируются они с помощью Entity-Relationship Diagram.</p>