Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Аватара пользователя
koalder

Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

Я, учусь создавать БД на MAccess2007 и для начала я взял список пестицидов, разрешёных применению в 2011 году. Вот я застрял на отрывке связи препарат-норма расхода-обрабатываемый объект-назначение. Пример таблицы в прикреплёном файле. По ходу тут отношение многие-ко-многим, но я не хочу чтобы так было. Если уж тут никак, то как тут лучше привести к 3-й нормальной форме? Думаю, проффесионалы сайта по БД помогут ... ПОМОГИТЕ!!!



Приведено к 1-й нормальной форме

препарат1 норма расхода а растение 1 вредитель 1

препарат1 норма расхода б растение 1 вредитель 2

препарат1 норма расхода в растение 2 вредитель 3

препарат1 норма расхода г растение 3 вредитель 3

препарат2 норма расхода д растение 4 вредитель 4
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
Delirium

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение Delirium »

Цитата koalder:



По ходу тут отношение многие-ко-многим
Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?




Совершенно верно, по другому никак.


Цитата koalder:



но я не хочу чтобы так было
Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?




А почему? Что мешает в таблицах иметь идентификаторы на другие таблицы?
Аватара пользователя
koalder

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

Запросы в MAccess2007 в режиме SQL Вашим способом, Delirium, количество таблиц и повторяемых данных резко уменьшится! Просто гениально!

Оказывается MAccess2007 более профессиональная прожка, чем думал. Теперь всё прояснилось! Значит нужно подучиться с написанием запросов. Изображение
Аватара пользователя
koalder

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

А как же всё-таки здесь таблицу привести к 3-й форме, чтобы в дальнейшем можно было легко им пользоваться?
Аватара пользователя
koalder

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

Цитата koalder:



препарат1 норма расхода а растение 1 вредитель 1

препарат1 норма расхода б растение 1 вредитель 2

препарат1 норма расхода в растение 2 вредитель 3
Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?




Тогда мы теряем вариант, например



Код:

Код: Выделить всё

препарат1 норма расхода б растение 1 вредитель 3

Если бы была жесткая зависимость расхода от препарата, то это одно дело. Но мы же можем взять расход Б, и разные препараты на разных вредителей.



Давай начнем с другого - чего ты хочешь добиться? Не стремись делать все по книжке, не надо педантично выстраивать схемы по 1-2-3 формам нормализации, Кодда-Бойса и т.п. Главное поставить конкретную цель и оттуда уже плясать.

Нормализация (Википелия)
Аватара пользователя
Delirium

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение Delirium »

Норма расхода зависит от уничтожаемого вредителя на конкретном растении и препарата, т.е. жёсткая зависимость и никак иначе.

Поэтому в таком случае следует в отдельных таблицах пронумеровать все растения, вредители (препараты уже пронумерованы). Но как связать с нормой расхода и препаратом связь растение-вредитель. Или ещё сделать ещё одну таблицу "растение-вредитель-норма расхода" и каждой такой строчке приделать ключ? Комп после этого у меня будет завистать? )
Аватара пользователя
koalder

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

Цитата koalder:



Норма расхода зависит от уничтожаемого вредителя на конкретном растении и препарата, т.е. жёсткая зависимость и никак иначе.
Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?




Я имею в виду, что норма расхода может быть одинаковой в разных случаях. Т.е., например, 100 гр(расход) может использоваться препаратом 1 на растение 2 вредителя 3, а также и на препарат 6 растение 3 вредителя 2. Если делать жесткую зависимость, то будут дублированные данные. Хотя с другой стороны, если делать как я говорю, то, сменив норму расхода 100 гр, мы сменим ее у всех, а это неверно.

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



Мне кажется, можно сделать как то так:

Таблица "Препараты" - в ней поле - норма расхода(текстовое, например, или число) и еще одно поле - ИД Растения. Будут примерно такие строки:



Код:

Код: Выделить всё

Мышьяк - 100 гр - 1
Мышьяк - 200 гр - 2
Мышьяк - 200 гр - 3
Химикат2 - 100 гр - 2

Вторая таблица - Растения

ИД растения - Растение - ИД вредителя



Код:

Код: Выделить всё

2 - Картофель - 1
3 - Свекла - 2

Ну и третья таблица - собственно сами вредители.



Код:

Код: Выделить всё

1 Жук
2 Муха

Такой связкой мы можем однозначно выбрать, к примеру, что 200 граммами мышьяка лечится свекла от вредителя мухи.
Аватара пользователя
Delirium

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение Delirium »

Действительно "добродушный помощник". Очень рад за такую помощь. Ещё чуть-чуть и Delirium переквалифицируется в агронома по защиет растений. :-).



Тут я всё понял! Препараты-Норма расхода не может повторяться. Как же я не додумался сделать так, будто Препарат-Норма расхода - это индивидуальное средство для решения проблемы Растение-Вредитель. Это значит появится ИД для каждого Препарат-Норма расхода-Растение-Вредитель как минимум (там есть и другие поля один-к-многим, но более понятные). Это так?
Аватара пользователя
koalder

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение koalder »

Цитата koalder:



появится ИД для каждого Препарат-Норма расхода-Растение-Вредитель как минимум
Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?




Нет, не появится. Не надо создавать отдельную таблицу со связками. У нас уже есть(если следовать моему примеру) 3 таблицы с индексами и ИД, и простейшим SQL запросом нужные нам данные выберутся моментально.





Код:

Код: Выделить всё

select препарат, норма расхода, растение, вредитель 
from препараты, растения, вредители 
where Препарат.ИД_Растения = Растения.ИД and 
растения.ИД_вредителя = Вредители.ИД and 
препарат.Наименование ='Мышьяк'

Выведет всё по мышьяку. Если добавить в конце AND Препарат.НормаРасхода='200', то покажет только данные по Картошке и свекле. Ну и так далее Изображение
Аватара пользователя
Delirium

Re: Прочие БД - [решено] Как привести эту таблицу к 3-й нормальной форме?

Сообщение Delirium »

koalder, я все таки отвечу на твое удаленное сообщение Изображение Все данные можно будет получить, лишь немного видоизменив приведенный мною запрос. А если все это делается в Access, то связи между таблицами и условия выборки можно будет задавать визуально и мышкой, а затем просмотреть код в режиме SQL.
Ответить

Вернуться в «Программирование и базы данных»