[МУЗЫКА] [МУЗЫКА] Если бы назначением нашей базы данных было только хранение отдельных сущностей, то структура ее была бы очень простой. Но наши сущности могут вступать в какие-то взаимоотношения друг с другом. Одной из задач базы данных является отыскание одних сущностей по значениям других, то есть нам нужно устанавливать некоторые связи между сущностями. Поскольку в базе данных могут быть тысячи сущностей, то чисто теоретически между ними могут существовать миллионы связей. Именно наличие этих связей определяет сложность построенной модели. Что такое связь? Связь — это отношение между объектами. Можно считать связью упорядоченный набор сущностей. У связей также есть идентификаторы. Идентификатором связи являются идентификаторы сущностей, которые в эту связь вступают. В диаграммах «сущность — связь» имя связи обычно заключается в ромб, в котором мы даем имя для каждой связи и соединяем также связываемые сущности линией, которая может иметь направленные концы в зависимости от типа связи. Как нам увидеть появление связи? Когда нам хочется сделать свойством одной сущности какую-то другую сущность или список сущностей, или когда хочется записать в одну сущность идентификатор другой. Значит, между сущностями существует связь. Связи, кроме идентификации связываемых объектов, могут иметь собственные атрибуты. Подобные связи, так же как и сущности, объединяются во множества. В чем кардинальное отличие сущностей и связей? В том, что связи не могут существовать отдельно без связываемых объектов, а объекты могут жить своей отдельной жизнью независимо от связей. Обычно связи идентифицируются при помощи соединения ключей связываемых сущностей. Чем можно характеризовать связь? У связи есть как минимум три характеристики: это размерность, мощность и модальность. Что такое размерность связи? Размерность связи определяет количество видов объектов которые в связи участвуют. Есть наиболее часто используемая связь между двумя видами объектов, она называется бинарная. Но связи бывают и более сложные: например, тернарные, если связь образуется тремя видами объектов; N-арные в общем случае; также бывают рекурсивные связи, когда в связь вступают объекты одного и того же вида. Приведем примеры таких связей. Например, сущность «студент» вступает в связь с преподавателем, сдавая ему экзамен. Связь между студентом и группой можно изобразить как «связь состоит», причем мы можем указать направление связи от студента к группе, указывая что студент закреплен за одной группой. Между одними и теми же видами сущностей может быть более одной связи. Например, студент может состоять в группе, а может являться старостой группы. Приведем пример тернарной связи. Для того чтобы провести экзамен, нужно взаимодействие трех сущностей. Это будет студент, который экзамен сдает; предмет, по которому проходит экзамен; и преподаватель, который этот экзамен проводит. Также у нашей тернарной связи будет свой собственный атрибут — оценка. Почему такой атрибут появляется у связи? Потому что оценка не является свойством студента, не является свойством предмета и тем более не является свойством преподавателя. Это будет именно свойство конкретной связи, которую мы назвали экзаменом. В рамках модели «сущность — связь» могут быть представлены не только тернарные, но и более сложные многомерные связи. Но хочется заметить, что такие связи очень сложно реализуются потом в контексте выбранной СУБД. Как же облегчить ситуацию? Всегда можно перейти от многомерной связи к бинарным. На нашем примере мы использовали тернарную связь «экзамен», а вместо этой связи можем ввести соединяющее множество сущностей. То есть вместо связи «экзамен» мы можем ввести в базу данных сущность, которая будет называться экзамен. И эта сущность будет вступать в бинарные связи с другими сущностями — со студентом, который будет экзамен сдавать; с преподавателем, который будет экзамен примнимать; и предмет, который будет на этот экзамен назначен. Таким образом, мы можем перейти от сложных многомерных связей к бинарным. Приведем пример рекурсивной связи. Предположим, что у нас хранится информация о сотрудниках, и один из сотрудников является руководителем. Используя рекурсивные связи, мы можем выстраивать сложные иерархические структуры. Когда мы говорили о сущностях, которые имеют идентификаторы, мы описывали независимые наборы сущностей. Но в нашей базе данных могут встречаться и зависимые сущности. Как они образуются? Приведем пример. Мы хотим хранить информацию о студентах, мы знаем, что у студента есть фамилия, имя, отчество, номер зачетки, которая является ключом, адрес и телефон. Посмотрим внимательнее на телефоны. У кого-то из студентов может совсем не быть телефона, а у кого-то их может быть несколько. А мы говорили, что значение каждого атрибута атомарно. Что же делать с телефоном? Возможный вариант — это вынести телефон в отдельную сущность, которую мы так и назовем «телефоном». Будет ли там идентификатор? Наверное, нет, потому что, если мы приводим, например, рабочий телефон или домашние телефоны, то у нескольких людей может быть один и тот же телефон. Стоит ли нам выдумывать какой-то отдельный специальный ключ? Наверное, не стоит. У нас просто есть возможность создать зависимую сущность. Мы называем сущность зависимой тогда, когда она не может существовать отдельно без связи с другой независимой сущностью. Чтобы подчеркнуть слабость таких сущностей, мы окружаем их название двойной линией. И связи, в которые такие сущности вступают с независимыми сущностями, также будут заключены в двойные ромбы. Такое описание зависимых сущностей позволяет нам не выдумывать специальный суррогатный ключ, который в системе не нужен. На этом мы рассмотрели с вами размерность связей, теперь перейдем к мощности и модальности.