Как определить функциональные зависимости

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

Например, я присвоил таблице «Пользователь» следующие атрибуты.
R(user_id, имя пользователя, regDate, тип, подписка)

Первичный ключ: user_id
Уникальный ключ: имя пользователя
Внешний ключ: подписка

Примерный набор данных может выглядеть примерно так:

1, JohnS, 01-01-2012, Администратор, NULL
2, PeterB, 01-02-2012, Модератор, Кино
3, PeterA, 01-02-2012, Пользователь, Кино
4, Гэри, 01.03.2012, Пользователь, Книги
5, Айрин, 01.03.2012, Пользователь, Кино
6, Стэн, 03-01-2012, Пользователь, Фильмы
7, Исаак, 01.04.2012, Пользователь, Книги

Часть, которую я не понимаю, - это то, как я определяю функциональные зависимости. Мое первоначальное ощущение состояло в том, что есть две функциональные зависимости, а именно:
user_id -> имя пользователя, regDate, тип, подписка
username -> user_id, regDate, тип , подписка

Однако, глядя на другие примеры на слайдах лекции, у меня возникают сомнения, правильно это или нет.


person Shiraz    schedule 02.01.2013    source источник


Ответы (4)


Если «имя пользователя» является одновременно уникальным и обязательным (уникальным и не нулевым), то это ключ-кандидат. В реляционном моделировании нет теоретической разницы между одним ключом-кандидатом и другим. В частности, в реляционном моделировании нет теоретической причины выбирать один ключ-кандидат и называть его «первичным ключом». Ключ есть ключ.

Так что ты прав. Здесь есть две функциональные зависимости. (Или 8, если разбить правую часть на отдельные столбцы. user_id -> username, user_id -> regDate и т. д.)

person Mike Sherrill 'Cat Recall'    schedule 02.01.2013
comment
Но разбиение на 8 столбцов не является хорошей практикой при разработке эффективной базы данных. - person Sahil Babbar; 01.04.2017
comment
@SahilBabbar: разложение составных функциональных зависимостей на отдельные функциональные зависимости — это не то же самое, что разложение отношения на отдельные атрибуты. - person Mike Sherrill 'Cat Recall'; 01.04.2017
comment
Есть еще много ФЗ, которые выполняются, те, что подразумеваются упомянутыми. Также предположительно остальные FD, использующие атрибуты этой схемы, не сохраняются. Учитывая заголовок «Как определить функциональные зависимости», это на самом деле не отвечает на вопрос и не опровергает заблуждения. - person philipxy; 13.02.2020

Функциональные зависимости определяются с теоретической точки зрения следующим образом (Википедия):

Для данного отношения R говорят, что набор атрибутов X в R функционально определяет другой набор атрибутов Y, также в R (записывается X → Y), если и только если каждое значение X связано точно с одним значением Y; Тогда говорят, что R удовлетворяет функциональной зависимости X → Y.

С технической точки зрения вы пытаетесь найти атрибуты, которые однозначно идентифицируют другие атрибуты. Для быстрого доступа определите ключи-кандидаты и атрибуты, которые от них зависят. Ваши примеры верны, потому что username, regDate, type, and subscription все зависит от значения user_id. Если username является уникальным и не нулевым, это ключ-кандидат, а также идентифицирующий набор атрибутов.

person Jordan Parmer    schedule 02.01.2013
comment
Прошу прощения за голосование против, но при поиске функциональных зависимостей НЕ достаточно определить ключи-кандидаты. Бывают случаи, когда присутствуют транзитивные ФД, поэтому набор столбцов определителя не является суперключом, поэтому ваш ответ неверен. - person Lajos Arpad; 26.10.2013

В дополнение к тому, что говорили другие, если атрибут (или набор атрибутов) является потенциальным ключом, то все атрибуты должны функционально зависеть от него.

  • «Функциональная зависимость» A->B просто означает, что никакие два разных значения B никогда не связаны с одним и тем же A. Чуть более формальное определение дано на Википедия, но на этом все.
  • Поскольку ключ должен быть уникальным, даже если два кортежа содержат одно и то же значение какого-либо атрибута (атрибутов), значения ключей все равно должны быть разными. Таким образом, разные значения никогда не могут относиться к одному и тому же значению ключа.

Поскольку все атрибуты функционально зависят от ключа(ов), при наличии любой другой функциональной зависимости автоматически создается транзитивная зависимость и нарушение 3NF. Таким образом, «не ключевая» зависимость может выступать в качестве красного флажка для обнаружения ошибок нормализации.


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

person Branko Dimitrijevic    schedule 03.01.2013
comment
Есть несколько допустимых случаев, когда 3NF не рекомендуется. Если у вас много записей и несколько столбцов могут быть получены из нескольких других столбцов с использованием некоторых функций, то во многих случаях лучше вычислить их один раз и прочитать только позже, чем вычислять значение каждый раз, когда вы их используете. - person Lajos Arpad; 26.10.2013

Я предполагаю, что вы используете MySQL, но если нет, вы можете реализовать свою идею в любой другой СУБД.

Выполните следующую команду, чтобы получить все ваши таблицы:

show tables;

Затем переберите все таблицы и выполните следующую команду для каждой из них:

show columns;

ФД можно описать следующим образом:

Determinant -> Dependent,
Determinant = {A1, ..., Am},
Dependent = {B1, ..., Bn}

где Ai и Bj — столбцы. Вам нужно сгенерировать все возможные сценарии для Determinant и Dependent. Для каждого сценария вам нужно будет просмотреть, существуют ли хотя бы две отдельные записи, в которых столбцы определителя совпадают, а хотя бы один из зависимых столбцов не совпадает. Если да, то сценарий не является ФД, в противном случае - ФД. Пример: Предположим, что m = 3 и n = 2:

select count(*) from mytable t1, mytable t2 where ((t1.A1 = t2.A1) and (t1.A2 = t2.A2) and (t1.A3 = t2.A3)) and ((t1.B1 <> t2.B1) or (t1.B2 <> t2.B2))

вернет количество записей, которые нарушают правило FD. Если значение равно 0, то сценарий является FD.

Конечно, в вашем конкретном случае вы можете пропустить несколько шагов, и вместо Ai и Bj у вас будут свои столбцы, но, надеюсь, вы поняли идею.

person Lajos Arpad    schedule 26.10.2013
comment
Я хочу добавить к этому, что это может показаться очевидным для некоторых, но все же заслуживает особого упоминания. Отсутствие опровержения не доказывает существование ПЗ, поэтому, если вы не найдете контрпример к данному ДО, это все равно не гарантирует, что это ДО действительно. Это, конечно, применимо только в том случае, если вы работаете с подмножеством кортежей, которые будут храниться в базе данных, поскольку FD могут быть опровергнуты новыми данными. - person Mitchell Carroll; 05.12.2015
comment
@MitchellCarroll, если вы наблюдаете FD, то это FD. Уже из того факта, что вы нашли ФЗ, вы не можете знать наверняка, применима ли эта ФЗ только сейчас или она гарантированно будет выполняться и в будущем. В одном из моих исследований, посвященных CFD (условной функциональной зависимости), которые применимы FD, если и только если выполняется условие, я разделил зависимости (D) на кажущиеся зависимости (AD) и реальные зависимости (RD). - person Lajos Arpad; 06.12.2015
comment
AD — это зависимости, которые выполняются в данный момент, а RD — это зависимости, которые гарантированно будут верны в любой данный момент. По сути, если вы знаете о D, что это RD, вы можете предотвратить вставки/обновления, которые нарушают их. Я написал код, который автоматически находит зависимости, и если они проверены как RD, то любая вставка/обновление, нарушающее их, вызовет исключение. Таким образом, система может автоматически находить ошибки с их точным местоположением в журналах ошибок. - person Lajos Arpad; 06.12.2015
comment
Вы делаете хорошее замечание, но если вы пытаетесь найти FD только по данным и без дополнительной информации, то RD не существует. Все это просто реклама, которую, возможно, придется удалить позже. - person Mitchell Carroll; 18.12.2015
comment
Для зависимостей, которые не были проверены как AD или RD, я использую термин CD, то есть зависимости-кандидаты. Когда вы найдете зависимость, вы не можете знать, является ли она RD или AD. Это разделение можно сделать, только зная некоторую дополнительную информацию. Итак, если вы обнаружите БФ, это может быть только кажущаяся или реальная закономерность. Это хороший подход, чтобы не предполагать, являются ли они AD или RD, и оставить ответ на плечи дальнейшего анализа. - person Lajos Arpad; 18.12.2015