2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Проблема в понимании 2НФ
Сообщение26.01.2018, 09:41 


02/04/13
294
Здравствуйте! У меня проблема в понимании 2НФ.
Есть 5 таблиц БД:

Покупатель..............Поставщик.................Товар...................Журнал покупок................Журнал поставок
id покупателя (PK)......id поставщика (PK)........id товара (PK).........id покупателя (FK) (PK).........id поставщика (FK) (PK)
ФИО........................Наименование.............Наименование........Дата (PK)..........................Дата (PK)
email.......................Адрес........................Цена....................id товара (FK) (PK)...............id товара (FK) (PK)
........................................................................................Количество.......................Количество

В тексте статьи пишут: "Посмотрим теперь на таблицу Журнал поставок: поле Количество зависит от Наименования товара и от Даты поставки, но не зависит от того, кто поставил товар (поле Поставщика). То есть таблица не находится в 2НФ."
Почему поле "Количество" не зависит от поля "id поставщика"? А если другой поставщик в ту же дату привезет тот же товар, но другого количества? Получается, что поле Количество должно зависеть от всех полей таблицы, а значит данная таблица уже находится в 2НФ. Где я ошибаюсь?

 Профиль  
                  
 
 Posted automatically
Сообщение26.01.2018, 10:36 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Компьютерные сети и Web-технологии» в форум «Карантин»
по следующим причинам:

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

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение26.01.2018, 11:27 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Computer Science»

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение26.01.2018, 19:02 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
melnikoff в сообщении #1287531 писал(а):
Почему поле "Количество" не зависит от поля "id поставщика"?
А схему можете нарисовать? Сейчас у меня на телефоне все расползается, непонятно, в какой таблице какое поле находится. И проверьте, правильно ли вы переписали текст, потому что сейчас у вас поле "Количество" таки зависит от id поставщика (если я правильно разобрался в этом расползающемся тексте).

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение26.01.2018, 19:30 


02/04/13
294
Схемы рисовать тут не умею, но могу показать скрин статьи (кликабельно):
Изображение
Сама статья.

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение26.01.2018, 21:03 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
melnikoff в сообщении #1287658 писал(а):
Глянул статью по диагонали - меня терзают смутные сомнения, стоит ли ее вообще читать. Как-то запутанно написано. Чуть попозже присмотрюсь повнимательнее.

Для рисования ER диаграмм могу посоветовать lucidchart.com или erdplus.com (ну это так, на будущее, вдруг пригодится).

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 01:51 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Да, ерунда какая-то. В концептуальной модели покупатели покупают товары у поставщиков, при этом покупатель и поставщик вообще никак не связаны. Причем этот грубый ляп сделан только для того, чтобы потом показать, что такое 2 НФ, причем показать криво и не с той стороны. В той же Википедии нормальные формы и то понятнее объяснены.
Ну а вообще, К. Дж. Дейт, "Введение в системы баз данных" - неустаревающая классика. После нее точно вопросов не останется.

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 07:55 


02/04/13
294
rockclimber в сообщении #1287707 писал(а):
Да, ерунда какая-то. В концептуальной модели покупатели покупают товары у поставщиков, при этом покупатель и поставщик вообще никак не связаны.

В модели вроде как покупатели покупают товары у магазина, в который эти товары поставляют поставщики. Или вы хотите сказать, что неплохо было бы понимать каким поставщиком поставлен товар, который купил покупатель? А в данной концептуальной модели мы это отследить не сможем?
Мне всё-таки интересно, таблица Журнал поставок (с составным ключом из трех полей: id поставщика, Дата и id товара) находится в 2НФ? На мой взгляд она находится даже в 3НФ, так как неключевое поле одно и оно функционально полно зависит от составного ключа и нетранзитивно зависит от составного ключа (неключевое поле-то одно).

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 10:30 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
В общем случае все зависит от задачи, которую вы решаете. В одном случае ваша таблица будет находиться в одной форме, в другом случае - в другой. Например, вам надо хранить адреса в таблице. Если это просто программа - записная книжка, вам достаточно сделать адрес одним атрибутом. Если у вас задача - вести огромную базу клиентов, и вам для оптимизации процессов важно иметь возможность выяснить (извлечь соответствующую информацию из базы), кто из клиентов живет на одной улице или в одном доме, вам надо будет сделать город, улицу, дом и квартиру как минимум отдельными атрибутами, а то и сущностями (таблицами). А если вы делаете БД кадастрового учета, там даже квартира будет отдельной сущностью с большим числом атрибутов, а может быть даже и несколько сущностей понадобится.
Что касается вашего примера, там с назначением этой БД не все ясно. В интернет-магазине может вообще нет надобности знать, товар какого именно поставщика купил покупатель. А на практике, насколько я знаю, идентичный товар разных поставщиков с точки хрения хранения в БД - это разные товары (то есть это будут две разные строки в таблице товаров), и если вы знаете, что купил покупатель, то вы автоматически знаете, у кого.

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 10:44 


02/04/13
294
Всё же вопрос относительно таблицы "Журнал поставок" остается. Она находится согласно описанной концептуальной модели в 2НФ? А в 3НФ? Тогда какая мотивация отделять от таблицы "Журнал поставок" таблицу "Поставки"?

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 18:50 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
melnikoff в сообщении #1287738 писал(а):
Всё же вопрос относительно таблицы "Журнал поставок" остается. Она находится согласно описанной концептуальной модели в 2НФ? А в 3НФ?
Максимум в первой. Смотрите тут какая штука: если мы посмотрим на таблицу "Журнал поставок", то там первичный ключ - это (id поставщика, id товара, дата), что означает, что один поставщик может продать каждый товар только один раз за день - или это не первичный ключ (тут можно пуститься в дебри и предположить, что в реальной системе мы будем фиксировать время поставки с точностью до микросекунд, но это всего лишь немного уменьшит степень маразма и вероятность коллизий, а не уберет их полностью). И даже если мы добавим к ключу поле "Количество", ограничение останется. Два клиента не смогут одновременно купить одинаковое количество одного и того же товара у одного поставщика. Обычно эта проблема решается введением сущности "заказ" и добавлением атрибута "номер заказа", который и становится (первичным) ключом. А пока ключей нет вообще.

melnikoff в сообщении #1287738 писал(а):
Тогда какая мотивация отделять от таблицы "Журнал поставок" таблицу "Поставки"?
Надо спрашивать у авторов статьи, я тут не могу ничего сказать. Вообще, при рассмотрении вопросов нормализации возможны два подхода:
1. Как в Википедии, книге Дейта и многих других местах, когда сначала дается одна большая таблица с данными. Вы определяете, где в этих данных атрибуты, кортежи и ключи, а потом последовательно приводите сначала к первой форме, потом первую ко второй и так далее.
2. Как в той статье. Вы делаете концептуальную модель по словесному описанию процесса. У вас нет никаких данных вообще, но на основании "общей бытовой" или бизнес-логики вы делаете предположения о том, какие данные могут быть, а какие не могут быть. Например, вряд ли человек, занесенный в базу как "клиент", станет товаром для продажи - рабство вроде как запретили уже, соответственно, вам не надо готовить вашу систему к такому повороту событий. А вот ситуация "два клиента хотят одновременно купить одинаковое количество одного и того же товара у одного поставщика" возможна, и вы должны это предусмотреть на этапе проектирования. Обычно, если вы все делаете правильно, на выходе с этапа концептуального проектирования у вас будет уже минимум 3НФ. Моделировать сначала полуготовую схему (в 2НФ), а потом доводить ее до ума с помощью ломика и какой-то матери, имхо, бессмысленно даже в учебных целях.

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 19:40 


02/04/13
294
rockclimber в сообщении #1287814 писал(а):
Максимум в первой. Смотрите тут какая штука: если мы посмотрим на таблицу "Журнал поставок", то там первичный ключ - это (id поставщика, id товара, дата), что означает, что один поставщик может продать каждый товар только один раз за день - или это не первичный ключ.

Дело в том, что обычно поставщики поставляют товар в магазин довольно редко. Поэтому допустим, что один поставщик никогда не делает более одной поставки в одну дату. Тогда составной ключ (id поставщика, id товара, дата) функционально полно определяет поле Количество, что соответствует 2НФ. Ну и автоматически таблица находится в 3НФ. Правильно? В этом случае особого смысла выделять таблицу Поставки нет?

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение27.01.2018, 23:31 
Аватара пользователя


29/05/17
808
melnikoff в сообщении #1287828 писал(а):
Дело в том, что обычно поставщики поставляют товар в магазин довольно редко.


Если бизнес небольшой, а товар ходовой, то могут и два и три раза подвозить.

melnikoff в сообщении #1287531 писал(а):
Получается, что поле Количество должно зависеть от всех полей таблицы, а значит данная таблица уже находится в 2НФ. Где я ошибаюсь?


Она не находится во 2НФ. Если один и тот же поставщик привезёт один и тот же товар в один и тот же день, то данные просуммируются. Т.е. в таблице "Журнал поставок" будет утеряна информация об одной поставке.

А вот дальше у них с таблицей "Цены" ошибка: два поставщика в один и тот же день могут привести товар по различной цене, а это там не предусмотрено. Обычно в таких случаях вводят понятие "Средняя цена".

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение28.01.2018, 01:21 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Mental в сообщении #1287872 писал(а):
Если один и тот же поставщик привезёт один и тот же товар в один и тот же день, то данные просуммируются.
Это в какой СУБД такой беспредел? В нормальной должно быть выброшено исключение из-за нарушения ограничения целостности.
Mental в сообщении #1287872 писал(а):
А вот дальше у них с таблицей "Цены" ошибка
Да там вся схема одна большая ошибка. Я пытаюсь придумать ТСу вменяемый ответ, открываю ту статью и у меня кровь из глаз идет.

melnikoff в сообщении #1287828 писал(а):
Тогда составной ключ (id поставщика, id товара, дата) функционально полно определяет поле Количество, что соответствует 2НФ. Ну и автоматически таблица находится в 3НФ. Правильно?
У них там написано
Цитата:
Посмотрим теперь на таблицу Журнал поставок: поле Количество зависит от Наименования товара и от Даты поставки, но не зависит от того, кто поставил товар (поле Поставщика).
прямо под схемой, где в таблице "Журнал поставок" есть поле "id поставщика". В каком месте они накосячили? Хотели сказать, зависит от поставщика? Или они хотели написать это про таблицу "Журнал покупок"? А "поле Поставщика" - это "id поставщика"? В общем, я не знаю, какие у них там формы. 2-я более-менее просматривается, и можно даже подобрать такую трактовку их "схемы", при которой там и третья будет.

 Профиль  
                  
 
 Re: Проблема в понимании 2НФ
Сообщение28.01.2018, 08:55 


02/04/13
294
rockclimber в сообщении #1287906 писал(а):
2-я более-менее просматривается, и можно даже подобрать такую трактовку их "схемы", при которой там и третья будет.

То есть, если трактовка такая: Заранее известно, что один поставщик никогда не делает более одной поставки в магазин в одну дату?
Тогда таблица "Журнал поставок" будет находиться в 2НФ и 3НФ?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group