Войти

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


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

Приведено к 1-й нормальной форме
препарат1 норма расхода а растение 1 вредитель 1
препарат1 норма расхода б растение 1 вредитель 2
препарат1 норма расхода в растение 2 вредитель 3
препарат1 норма расхода г растение 3 вредитель 3
препарат2 норма расхода д растение 4 вредитель 4

Delirium
22-11-2011, 13:12
По ходу тут отношение многие-ко-многим »
Совершенно верно, по другому никак.
но я не хочу чтобы так было »
А почему? Что мешает в таблицах иметь идентификаторы на другие таблицы?

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

koalder
22-11-2011, 14:39
Идентификаторы в различных таблицах это же здесь около 3-х таблиц! Или у меня плохое представление об идентификаторах

Delirium
22-11-2011, 16:50
препарат1 норма расхода а растение 1 вредитель 1
препарат1 норма расхода б растение 1 вредитель 2
препарат1 норма расхода в растение 2 вредитель 3 »
Тогда мы теряем вариант, например
препарат1 норма расхода б растение 1 вредитель 3

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

Давай начнем с другого - чего ты хочешь добиться? Не стремись делать все по книжке, не надо педантично выстраивать схемы по 1-2-3 формам нормализации, Кодда-Бойса и т.п. Главное поставить конкретную цель и оттуда уже плясать.
Нормализация (Википелия) (http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0)

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

Delirium
23-11-2011, 01:04
Норма расхода зависит от уничтожаемого вредителя на конкретном растении и препарата, т.е. жёсткая зависимость и никак иначе. »
Я имею в виду, что норма расхода может быть одинаковой в разных случаях. Т.е., например, 100 гр(расход) может использоваться препаратом 1 на растение 2 вредителя 3, а также и на препарат 6 растение 3 вредителя 2. Если делать жесткую зависимость, то будут дублированные данные. Хотя с другой стороны, если делать как я говорю, то, сменив норму расхода 100 гр, мы сменим ее у всех, а это неверно.
Да, я соглашусь, здесь связь должна быть жесткой, в ущерб дублированием данных.

Мне кажется, можно сделать как то так:
Таблица "Препараты" - в ней поле - норма расхода(текстовое, например, или число) и еще одно поле - ИД Растения. Будут примерно такие строки:
Мышьяк - 100 гр - 1
Мышьяк - 200 гр - 2
Мышьяк - 200 гр - 3
Химикат2 - 100 гр - 2
Вторая таблица - Растения
ИД растения - Растение - ИД вредителя
2 - Картофель - 1
3 - Свекла - 2
Ну и третья таблица - собственно сами вредители.
1 Жук
2 Муха
Такой связкой мы можем однозначно выбрать, к примеру, что 200 граммами мышьяка лечится свекла от вредителя мухи.

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

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

Delirium
25-11-2011, 01:14
появится ИД для каждого Препарат-Норма расхода-Растение-Вредитель как минимум »
Нет, не появится. Не надо создавать отдельную таблицу со связками. У нас уже есть(если следовать моему примеру) 3 таблицы с индексами и ИД, и простейшим SQL запросом нужные нам данные выберутся моментально.

select препарат, норма расхода, растение, вредитель
from препараты, растения, вредители
where Препарат.ИД_Растения = Растения.ИД and
растения.ИД_вредителя = Вредители.ИД and
препарат.Наименование ='Мышьяк'
Выведет всё по мышьяку. Если добавить в конце AND Препарат.НормаРасхода='200', то покажет только данные по Картошке и свекле. Ну и так далее :)

Delirium
26-11-2011, 02:53
koalder, я все таки отвечу на твое удаленное сообщение :) Все данные можно будет получить, лишь немного видоизменив приведенный мною запрос. А если все это делается в Access, то связи между таблицами и условия выборки можно будет задавать визуально и мышкой, а затем просмотреть код в режиме SQL.

koalder
27-11-2011, 10:36
Запросы в MAccess2007 в режиме SQL Вашим способом, Delirium, количество таблиц и повторяемых данных резко уменьшится! Просто гениально!
Оказывается MAccess2007 более профессиональная прожка, чем думал. Теперь всё прояснилось! Значит нужно подучиться с написанием запросов. :yahoo:

Delirium
27-11-2011, 11:33
Оказывается MAccess2007 более профессиональная прожка, чем думал »
Это не просто "прожка", это продукт, позволяющий спроектировать огромную и качественную базу. Впоследствии перевести ее на крупную базу вроде mySQL или MS SQL не составит труда, т.к. синтаксис SQL практически не отличается.
А наличие встроенных форм, отчетов и т.п. позволяет сделать полноценный продукт практически без программирования :)

И еще добавлю. Если создать схему данных в Access (тоже только мышкой), то впоследствии, при создании запросов и прочего, связи между таблицами будут выставляться автоматически.

koalder
20-12-2011, 09:00
Продолжение

ДВ - действующее вещество
С - содержание ДВ в препарате

Препарат 1 - ДВ 1, ДВ 2, ДВ 3, ДВ 4, ДВ 5 - С 1, С 2, С 3, С 4, С 5
Препарат 2 - ДВ 3 - С 6
Препарат 3 - ДВ 7, ДВ 8, ДВ 9 - С 7, С 8, С 9

М/у отношением Препарат и ДВ(?) также куча отношений с которыми уже разобрался.
Пытался нарушить 1-ю нормальную форму, создав списки с поддержкой нескольких значений в ячейках, но количество ДВ слишком много. Всё-таки нужно здесь перевести на 3-ю нормальную форму, но как так только дальше управлять такой кучей информации?!

Пример:
Альто Супер - диазинон, фенол, акриламид, беномил, комплекс хлораминовых кислот - 250 г/кг, 15 г/кг, 35 г/кг, 57 г/кг, 150 г/кг
Престиж - акриламид - 500 г/кг
Фитоспорин - Bacillus turengensis (штамм H324N), спорово-кристаллический комплекс аминокислот, продукты выделения грибов Asp. niger - 2 млрд. клеток и спор/г, 15 г/кг, 5 г/кг

1. У каждого препарата может быть до 5 действующих веществ и выше (в справочнике пестицидов не встречалось выше 5)
2. У нескольких препаратов могут быть общие действующие вещества с одинаковыми или разными их содержанием в препарате.
3. Причём у каждого действующего вещества своё определённое содержание в препарате.
4. Список действующих веществ свыше 300 (неограниченное количество).

Есть ещё вариант сделать в этом отношении в качестве первичного ключа номер действующего вещества (ДВ):
1 – ДВ 1 – Препарат 1 – С 1
2 – ДВ 1 – Препарат 2 – С 2
3 – ДВ 2 – Препарат 3 – С 3
4 – ДВ 3 – Препарат 2 – С 4

Как мне решить этот вопрос, чтобы было легче управлять этим БД?
Заранее спасибо :)

Delirium
22-12-2011, 04:08
koalder, в данное время я нахожусь в отпуске, плюс юбилеи у меня и жены, плюс НГ, плюс еще один ДР, плюс переезд на новую квартиру, плюс ремонт в квартире - пока, к сожалению, нет времени подумать и предложить идею :)
Но, в любом случае, у тебя должны быть справочники на ВСЕ, что повторяется, т.е. ИД, Наименование. как минимум полей. А вот дозы (250 г/кг, 15 г/кг, 35 г/кг, 57 г/кг, 150 г/кг) можно сделать просто вводом, справочник для этого не нужен. Желателен только справочник объемов, т.е. г/кг, мг/кг и т.д., дабы избежать ошибок при вводе.

koalder
24-12-2011, 21:46
Delirium, спасибо, что всё-таки уделил время. Несколько поздновато, но я уже сделал по второму моему способу и, вроде, всё нормально с базой почти, разве что появились 2 вершины в структуре. Далее вроде всё должно работать.
А, да, поздравляю со всем этим, там, теми самыми событиями. Надо же, бывает так, чтобы всё сразу!

Delirium
25-12-2011, 07:11
koalder, главное, что проблема решена :)
А за поздравления спасибо :) Вот провел интернет на новую квартиру, лежу на диване с буком и читаю форум, пока жена и дети спят :)




© OSzone.net 2001-2012