Нормализация генерирует таблицу без четкой цели

Обзор

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

ПРИМЕЧАНИЕ

  1. Для краткости я удалил большинство атрибутов, не имеющих отношения к этому вопросу.

  2. Хотя названия атрибутов говорят сами за себя, я дал краткое описание рядом с атрибутом в 0NF.

  3. ID означает, что ID является частью первичного ключа.

  4. В одном SupplierInvoice или CustomerInvoice может быть несколько Продуктов.

0 NF

  • SupplierInvoiceID — идентификатор счета-фактуры, предоставленный поставщиком после того, как магазин купил у него товар.
  • SupplierName - Имя поставщика
  • CustomerInvoiceID — идентификатор счета, предоставленного покупателю после покупки товаров в магазине.
  • CustomerName - Имя Заказчика
  • ProductID — идентификатор, связанный с продуктом.
  • ProductDesc — краткое описание товара.
  • QtySold — количество товара, проданного покупателю за одну транзакцию.
  • QtyBought — количество товара, которое было куплено у поставщика за одну транзакцию.
  • CustomerID - идентификатор, присвоенный клиенту

Функциональная зависимость

  • SupplierInvoiceID -> SupplierID, SupplierName
  • CustomerInvoiceID -> CustomerID, CustomerName
  • Идентификатор поставщика -> Имя поставщика
  • Идентификатор клиента -> Имя клиента
  • ProductID -> ProductDesc
  • SupplierInvoiceID, ProductID -> QtyBought
  • CustomerInvoiceID, ProductID -> QtySold

1 NF

  • Shop {SupplierInvoiceID, CustomerInvoiceID, ProductID, SupplierID, SupplierName, CustomerID, CustomerName, ProductDesc, QtyBought, QtySold}

2 NF

  • Магазин {SupplierInvoiceID, CustomerInvoiceID, ProductID}
  • SupplierInvoice {SupplierInvoiceID, SupplierID, SupplierName}
  • CustomerInvoice {CustomerInvoiceID, CustomerID, CustomerName}
  • Product {ProductID, ProductDesc}
  • ProductSupply {SupplierInvoiceID, ProductID, QtyBought}
  • ProductSale {CustomerInvoiceID, ProductID, QtySold}

3 NF

  • Магазин {SupplierInvoiceID, CustomerInvoiceID, ProductID}
  • SupplierInvoice {SupplierInvoiceID, SupplierID}
  • Поставщик {SupplierID, SupplierName}
  • CustomerInvoice {CustomerInvoiceID, CustomerID}
  • Клиент {CustomerID, CustomerName}
  • Product {ProductID, ProductDesc}
  • ProductSupply {SupplierInvoiceID, ProductID, QtyBought}
  • ProductSale {CustomerInvoiceID, ProductID, QtySold}

Эта проблема

Согласно книгам и ресурсам, которые я использовал в качестве справки, при переходе от 1NF к 2NF создается таблица для поддержания связи между первичными ключами из 1NF (здесь эту работу берет на себя таблица Shop). Однако с логической точки зрения между атрибутами CustomerInvoiceID и SupplierInvoiceID не должно быть никакой связи.


comment
@philipxy Стол Магазин меня озадачивает. Я пытаюсь понять, что это будет означать, то есть зачем нам поддерживать отношения между SupplierInvoice и CustomerInvoice.   -  person Isfaaq    schedule 31.03.2019
comment
Если вам нужны отзывы о вашей декомпозиции: покажите этапы вашей работы в соответствии с вашим справочником/учебником с обоснованием - мы хотим проверить вашу работу, но не переделывать ее, и нам нужен ваш выбор, когда алгоритм позволяет их, а в противном случае мы не можем' Я не скажу вам, где вы ошиблись (или ошиблись). См. хиты в гугле «домашнее задание по стеку обмена». И поскольку 0NF и 1NF не имеют фиксированного значения, пожалуйста, дайте название и издание вашего учебника и его определения.   -  person philipxy    schedule 31.03.2019
comment
Теперь мой ответ объясняет, почему 2NF/3NF Ship в каком-то смысле странный. На самом деле мы не можем рассмотреть то, что вы пытаетесь выразить в деталях, пока вы не сформулируете это ясно. (Что значит поддерживать отношения между Первичными ключами? Что значит с логической точки зрения? И почему не должно быть никаких отношений?) И ваш пост на самом деле не задает вопроса. Пожалуйста, уточните через правки, а не комментарии. Но ответ кажется разумным, поскольку я даю четкие представления о нормализации рассуждений.   -  person philipxy    schedule 31.03.2019
comment
@philipxy давайте предположим, что я начинаю заполнять данные. Что меня беспокоит, так это то, что будут указывать данные в таблице магазинов?   -  person Isfaaq    schedule 02.04.2019
comment
Я сказал вам, что в версии моего ответа прямо перед вашим комментарием Магазин будет представлять следующие отношения: FOR SOME values for ProductDesc, ..., [the expression above]. Я отредактировал свой ответ, чтобы переместить это и некоторые дополнительные объяснения в ps в конце. (Остальная часть ответа немного изменена и расширена по сравнению с предыдущим.) PS Мои предыдущие комментарии остаются в силе.   -  person philipxy    schedule 04.04.2019


Ответы (1)


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

не должно быть никакой связи между атрибутами CustomerInvoiceID и SupplierInvoiceID

В реляционной модели отношения/ассоциации представлены отношениями. Из исходной статьи Кодда 1970 года:

Изображенное отношение называется component. [...] Значение component(x, y, z) состоит в том, что часть x является непосредственным компонентом (или составной частью) детали y, и z единиц детали x необходимы для сборки одной единицы части y.

Ваша таблица 1NF Shop уже представляет отношение для CustomerInvoiceID, SupplierInvoiceID и т. д. Она содержит строки, которые составляют истинное утверждение (предложение) из шаблона заявления ((характеристика) предикат) примерно так:

    product ProductID is described as ProductDesc
AND supplier SupplierID is named SupplierName
AND invoice SupplierInvoiceID is from supplier SupplierID
AND invoice SupplierInvoiceID bills for QtyBought of product ProductID
AND customer CustomerID is named CustomerName
AND invoice CustomerInvoiceID is to customer CustomerID
AND invoice CustomerInvoiceID bills for QtySold of product ProductID

В вашей цитируемой фразе вы, возможно, пытаетесь создать какое-то впечатление, что наборы идентификаторов счетов-фактур поставщиков и идентификаторов счетов-фактур клиентов в некотором смысле независимы. И в каком-то смысле они есть. Но в другом смысле это не так: мы можем представить себе бизнес-правило, согласно которому идентификаторы счетов-фактур ограничены таким образом, что счета-фактуры клиентов включают продукты, которые включают счета-фактуры поставщиков. Конечно, идентификаторы настолько ограничены в этой связи/таблице. Независимо от того, какие точные определения и утверждения можно было бы привести для решения таких идей, нормализация к более высоким НФ (нормальным формам) просто создает отношения/таблицы из заданных. Компонентные отношения — это определенные преобразования конъюнктов исходных отношений. (Иногда это логически эквивалентно самим конъюнктам.) Незнание того, что компонент представляет отношение и что это такое, может быть причиной того, что 2NF/3NF Shop кажется вам странным.

при переходе с 1 НФ на 2 НФ создается таблица для поддержания связи между Первичными Ключами из 1 НФ

Нормализация к более высоким NF заменяет таблицу другими, которые являются ее проекциями, которые естественным образом присоединяются к ней. Он включает в себя FD (функциональные зависимости) и CK (ключи-кандидаты). Не PK (первичные ключи) как таковые - PK - это просто некоторый CK, который вы решили назвать "PK". Нормализация «поддерживает» исходное отношение в том смысле, что это отношение выражается как соединение/И отношений компонентов и представлено их естественным соединением.

Ваш проект 1NF не может регистрировать продукты, поставщиков или клиентов, которым не выставлены счета. Вы можете обнаружить этот факт при нормализации к более высоким NF, но нормализация к более высоким NF не устраняет такие проблемы (аномалии обновления и удаления) — несмотря на (плохие) презентации, в которых говорится, что это происходит. Кроме того, он записывает только те продукты, которые указаны как в счете-фактуре поставщика, так и в счете-фактуре клиента. Возможно, поэтому вам это кажется странным. Использование одной таблицы для всех этих атрибутов не является частью хорошего метода информационного моделирования. 2NF/3NF Shop - продукт правильной нормализации, а не "хорошего" оригинала.

Тоже не от "хорошей" нормализации. В общем случае существует более одного разложения НФ. Мы используем некоторые проверенные алгоритмы с плюсами и минусами, и нам, возможно, все же придется решить, какой из множества декомпозиций мы предпочитаем. Мы не нормализуем данную НФ, проходя через более низкие НФ, несмотря на то, что в (плохих) презентациях говорится, что мы это делаем. Здесь вы выбрали дизайн 2NF с магазином компонентов, но затем, когда вы выбрали другие компоненты, магазин компонентов стал избыточным — это проекция естественного соединения других компонентов. Возможно, поэтому вам это кажется странным.

Реляционная модель, дизайн базы данных и нормализация.
Есть ли какое-нибудь эмпирическое правило для создания SQL-запроса из описания, понятного человеку?

PS "0NF" и "1NF" не имеют фиксированного значения.

PS Re 2NF/3NF Магазин

Компонент — это проекция оригинала. Это строки, в которых его столбцы образуют подстроку оригинала. Таким образом, это строки, в которых существуют значения для других столбцов, так что значения столбцов компонентов и другие значения столбцов образуют строку в оригинале. Это то же самое, что сказать, что отношение компонента является ДЛЯ НЕКОТОРЫХ или СУЩЕСТВУЕТ в других столбцах, применяемых к исходному отношению.

Предполагая и повторяя приведенное выше выражение для отношений 1NF Shop, 2NF/3NF Shop представляет следующие отношения:

FOR SOME values for ProductDesc,
    SupplierID, SupplierName, QtyBought,
    CustomerID, CustomerName & QtySold
    [   product ProductID is described as ProductDesc
    AND supplier SupplierID is named SupplierName
    AND invoice SupplierInvoiceID is from supplier SupplierID
    AND invoice SupplierInvoiceID bills for QtyBought of product ProductID
    AND customer CustomerID is named CustomerName
    AND invoice CustomerInvoiceID is to customer CustomerID
    AND invoice CustomerInvoiceID bills for QtySold of product ProductID
    ]

Т.е. строки, где:

    product ProductID is described as something
AND some supplier is named something
AND invoice SupplierInvoiceID is from that supplier
AND invoice SupplierInvoiceID bills for some quantity of product ProductID
AND some customer is named something
AND invoice CustomerInvoiceID is to that customer
AND invoice CustomerInvoiceID bills for some quantity of product ProductID

Предполагая, что у продуктов есть описания, у поставщиков и клиентов есть имена и что в счете-фактуре выставляется счет за продукт в определенном количестве или количествах, это строки, где:

    invoice SupplierInvoiceID bills for product ProductID
AND invoice CustomerInvoiceID bills for product ProductID

Это строки, возвращаемые проекцией на 3 атрибута магазина 1NF. Если у нас есть в качестве основы/компонента таблица для каждого конъюнкта, который я дал для предиката Магазина 1НФ, таблицы вашего проекта 3НФ или таблицы вашего проекта 2НФ, то в том смысле, что вы можете таким образом запросить для этих строк 2NF/3NF Shop является избыточным в качестве базы/компонента.

person philipxy    schedule 31.03.2019