В реляционной базе данных зависимость возникает, когда информация, хранящаяся в той же таблице базы данных, однозначно определяет другую информацию, хранящуюся в той же таблице. Многозначная зависимость возникает, когда наличие одной или нескольких строк в таблице подразумевает наличие одной или нескольких других строк в той же таблице. Иными словами, два атрибута (или столбца) в таблице независимы друг от друга, но оба зависят от третьего атрибута.
Многозначная зависимость препятствует нормализации стандартной четвертой нормальной формы. Реляционные базы данных следуют пяти обычным формам, которые представляют собой рекомендации по дизайну записей. Они предотвращают аномалии обновления и несоответствия в данных. Четвертая нормальная форма имеет дело с отношениями «многие к одному» в базе данных.
Функциональная зависимость против многозначной зависимости
Чтобы понять многозначную зависимость, полезно вернуться к тому, что такое функциональная зависимость.
Если атрибут X однозначно определяет атрибут Y, то Y функционально зависит от X. Это записывается как X -> Y. Например, в приведенной ниже таблице «Студенты» имя_студента определяет майор:
Имя_Студента | Майор |
---|---|
Рави | История искусства |
Бет | Химия |
Эту функциональную зависимость можно записать так: Student_Name -> Major. Каждое имя студента определяет ровно одну специальность и не более.
Если вы хотите, чтобы в базе данных также отслеживались виды спорта, которыми занимаются эти студенты, вы можете подумать, что самый простой способ сделать это - просто добавить еще один столбец под названием «Спорт:».
Имя_Студента | Майор | Спорт |
---|---|---|
Рави | История искусства | Футбол |
Рави | История искусства | Волейбол |
Рави | История искусства | Теннис |
Бет | Химия | Теннис |
Бет | Химия | Футбол |
Проблема в том, что и Рави, и Бет занимаются несколькими видами спорта. Для каждого дополнительного вида спорта необходимо добавить новую строку.
В этой таблице введена многозначная зависимость, поскольку специальность и вид спорта не зависят друг от друга, но оба зависят от студента. Это простой пример, и его легко идентифицировать, но многозначная зависимость может стать проблемой в большой и сложной базе данных.
Многозначная зависимость записывается X ->-> Y. В этом случае:
Имя_студента ->-> Специальность
Имя_студента ->- > Спорт
Это читается как "Имя_ученика мультиопределяет специальность" и "Имя_ученика мультиопределяет спорт".
Для многозначной зависимости всегда требуется как минимум три атрибута, поскольку она состоит как минимум из двух атрибутов, зависящих от третьего.
Многозначная зависимость и нормализация
Таблица с многозначной зависимостью нарушает стандарт нормализации четвертой нормальной формы, поскольку создает ненужную избыточность и может привести к несогласованности данных. Чтобы довести это до 4НФ, необходимо разбить эту информацию на две таблицы.
В приведенной ниже таблице теперь есть функциональная зависимость Student_Name -> Major и нет многозначных зависимостей:
Имя_Студента | Майор |
---|---|
Рави | История искусства |
Рави | История искусства |
Рави | История искусства |
Бет | Химия |
Бет | Химия |
Хотя эта таблица также имеет единственную функциональную зависимость Student_Name -> Sport:
Имя_Студента | Спорт |
---|---|
Рави | Футбол |
Рави | Волейбол |
Рави | Теннис |
Бет | Теннис |
Бет | Футбол |
Нормализация часто достигается за счет упрощения сложных таблиц, чтобы они содержали информацию, относящуюся к одной идее или теме, вместо того, чтобы пытаться сделать одну таблицу содержащей слишком много разрозненной информации.