2016-09-01 3 views
0

Здесь у меня есть таблица вроде этого:Проектирование баз данных - транзитивное зависимость

enter image description here

Это упрощенный вариант. Предположим, что у одного клиента есть требование к услуге или нет. В этой таблице требований isServiced является двоичным значением, если это правда, мы должны позволить клиенту выбрать одну компанию поставщика услуг из таблицы поставщика (таблицы поиска), если она ложна, это означает, что клиент не хочет иметь сервис, поэтому просто оставьте ServiceCompany равным нулю.

Мой вопрос в том, что это нарушает 3-ей нормальную форму. Независимо от того, имеет ли она проблему транзитивной зависимости, которая является сервисной компанией, зависит от isServiced, зависит от требования_id.

Если у неё есть проблема, как я могу ее решить?

+0

На самом деле, почему есть индикатор 'isServiced'? Если клиент хочет услугу, они выбирают один и вводят его в таблицу «Требование». Если они не хотят службы, не делайте никаких записей в «Требовании» вообще. – TommCatt

ответ

3

Если значение NULL считается значением, то существует транзитивная зависимость, указанная @WalterMitty.

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

(Requirement_id, FALSE) 
(Requirement_id, TRUE, ServiceCompany_id) 

Я бы говорят, что оба находятся в 3NF, несмотря на константу, но я бы не решался сказать то же самое о таблице, которая представляет разные отношения.

Обратите внимание, что isServiced является избыточным - его можно получить из значения или его отсутствия в ServiceCompany_id. Так, что оставляет нас с:

(Requirement_id) 
(Requirement_id, ServiceCompany_id) 

Если у вас есть другие данные, зависящие от Requirement_id, вы могли бы рассмотреть возможность записи только строки для клиентов, которые хотят услугу, в этом случае вы бы безопасно на территории 3NF.

+0

Хороший ответ. В частности, указывая, что NULL является признаком, но (классически) не значением. Кроме того, указывая на то, что NULL является признаком таблицы, но не имеет отношения в реферате. –

0

Отношение находится в третьей нормальной форме, так как значение ServiceCompany_id не определяется однозначно isServiced.

Фактически функциональная зависимость A → B означает, что если две или более строки имеют одинаковое значение A, то они должны иметь одинаковое значение B (но здесь это не так, поскольку, когда isServiced истинно, у вас разные значения для ServiceCompany_id).

Таким образом, вам не нужно изменять отношения.

+2

с учетом NULL, это не отношение по определению, следовательно, не в 1NF.Мы не должны изменять математические определения для удобства SQL. Это не значит, что он не сработает :) –

1

Значение isServiced определяется ServiceCompanyId. Если ServiceCompanyId равно NULL, то isServiced имеет значение FALSE. Если ServiceCompanyId ничего, кроме NULL, то isServiced имеет значение TRUE.

Эта зависимость находится в обратном направлении от той, которую вы подняли в вопросе. Но это все еще транзитная зависимость.

Однако во всех случаях, которые я видел при отклонении от 3NF, они никогда не сталкивались с зависимостью от того, является ли другое значение NULL. Если он работает так, как я думаю, значит, требование не в 3NF.

Смежные вопросы