Вторая нормальная форма. Правила нормализации БД

Второе видео из серии о нормализации отношений баз данных. На примере понятно и доступно рассказывается о том, как спроектировать таблицу базы данных, чтобы она соответствовала условиям второй нормальной форме.
I НФ (первая нормальная форма): • Первая нормальная форм...
III НФ (третья нормальная форма): • Третья нормальная форм...
Первая, вторая, третья нормальные формы на практике: • Первая, вторая, третья...
Нормальная форма Бойса-Кодда (BCNF): • Нормальная форма Бойса...
Четвертая нормальная форма, правила нормализации отношений: • Четвертая нормальная ф...
Присоединяйтесь к нам!
Наша группа в контакте: excellentprogrammer
Желаю вам успехов обучении!

Пікірлер: 66

  • @JohnnySvarog
    @JohnnySvarog6 жыл бұрын

    Изучили вторую нормальную форму? Отлично, так держать! Но этого не достаточно для того, чтобы проектировать БД, мой друг! Самое время изучить 3-ю НФ и закрепить материал с видео о секретах нормализации (ссылки в описании). Успехов в обучении!

  • @Dirkiz

    @Dirkiz

    4 жыл бұрын

    Отличный материал, спасибо!

  • @den1us
    @den1us4 жыл бұрын

    Блин, ну есть же те, кто может рассказать понятно, а не как преподы в универе.

  • @alisonrae
    @alisonrae2 жыл бұрын

    Блин, нашла канал, и очень расстроена, что новых видео не было уже год 😢 надеюсь, ты ещё читаешь новые комментарии, потому что хочу сказать большое спасибо 😊

  • @albanec4702
    @albanec470223 сағат бұрын

    Прекрасная серия уроков: всё доходчиво и непринуждённо представлено - спасибо большое!

  • @georgel3689
    @georgel36894 жыл бұрын

    Наконец-то кто-то идеально продемонстрировал составной первичный ключ, благодаря чему стало понятно что же такое 2НФ. Огромное спасибо!!!

  • @brodlovherrsov7097
    @brodlovherrsov70974 жыл бұрын

    Благодарю за урок!

  • @user-qy6rc8re4x
    @user-qy6rc8re4x3 жыл бұрын

    Отличное видео! Спасибо!

  • @user-wz9vl9li7q
    @user-wz9vl9li7q4 жыл бұрын

    Спасибо! Молодец! Очень всё понятно!!!

  • @user-zz4fj4ke9f
    @user-zz4fj4ke9f3 жыл бұрын

    а почему на 2:19 не создать полностью уникальный идентификатор, то есть автоинкремент, как и говорилось? почему именно два инкремента нужно?

  • @romanmotovilov129
    @romanmotovilov1293 жыл бұрын

    Спасибо за урок! Все очень просто и доходчиво!

  • @alexanderzaremba4595
    @alexanderzaremba45955 жыл бұрын

    Спасибо. Очень все понятно. В универе бы так объясняли в свое время

  • @AndKozinsky
    @AndKozinsky Жыл бұрын

    Спасибо за понятные объяснения!

  • @vitaliygorbunov3599
    @vitaliygorbunov3599 Жыл бұрын

    Отлично объяснили, было полезно, спасибо!

  • @ma1inari
    @ma1inari5 жыл бұрын

    Спасибо!

  • @SergeSchekhovtsov
    @SergeSchekhovtsov3 жыл бұрын

    Спасибо, все доходчиво и понятно

  • @ilyagoldovskiy1028
    @ilyagoldovskiy10282 жыл бұрын

    Наконец-то доступным языком, спасибо!

  • @iryna6389
    @iryna63894 жыл бұрын

    Спасибо!!!

  • @user-on4ce8fg8s
    @user-on4ce8fg8s6 жыл бұрын

    Очень хорошо и доступно! Больше вам просмотров!

  • @JohnnySvarog

    @JohnnySvarog

    6 жыл бұрын

    большое спасибо! а вам - успехов в обучении!

  • @user-mh4cv1jy2s

    @user-mh4cv1jy2s

    2 жыл бұрын

    @@JohnnySvarog а что значит скалярное значение?

  • @karinalazareva6123

    @karinalazareva6123

    Жыл бұрын

    @@user-mh4cv1jy2s скалярное значение = одно значение из списка. В видео пример с ингредиентами, то есть, есть список ингредиентов (мука, соль, сахар и тд.) из которых можно готовить различные блюда.. В соответствии с 1НФ в таблице необходимо писать одно значение каждому продукту: шарлотка - мука, шарлотка - соль, шарлотка - сахар..

  • @vladaronov7505
    @vladaronov75057 ай бұрын

    Большое спасибо! Всё чётко и понятно. Изучаю Д.Л.Осипова "Технологии проектирования БД". Ваш видеокурс - прекрасное наглядное дополнение для лучшего усвоения материала!

  • @peronium_
    @peronium_4 жыл бұрын

    блин, да ты крут! лайк подписка, все по списку

  • @Daiwin74
    @Daiwin743 жыл бұрын

    Спасибо

  • @user-cp3lf2mm4t
    @user-cp3lf2mm4t3 жыл бұрын

    супер!

  • @skily4866
    @skily48663 жыл бұрын

    а как понимать таблицу Product_Ingredients , она содержит 2 атрибута - 2 внешних ключа, а первичных у нее нет, значит она не в второй форме?

  • @wob03omsan38

    @wob03omsan38

    3 жыл бұрын

    Просто там составной ключ, состоящий из 2-ух внешних, но сочетание их уникально: обычная практика

  • @asd-pw1wk
    @asd-pw1wk3 жыл бұрын

    Какая музыка играет в фоне?

  • @ZEXthn
    @ZEXthn2 жыл бұрын

    А если к примеру один поставщик нам поставляет несколько ингредиентов ?)

  • @Max-wn2gd
    @Max-wn2gd5 жыл бұрын

    спасибо! но, что мешало сразу добавить столбец id в качестве первичного ключа и оставить в исходной таблице столбец ингредиентов ? и что значит "описывать ключ " ? как атрибуты могут описывать ключ, если он по сути просто является идентификатором

  • @mossdi

    @mossdi

    5 жыл бұрын

    "Описывает ключ" означает, что по идентификатору вы можете получить строку из таблицы, в которой будут поля с атрибутами, которые привязаны исключительно к этому идентификатору. Если же оставить в исходной таблице столбец с ингредиентами, то можно нарваться на неприятности. К примеру вы захотите изменить Мука в/с на Мука высшего сорта, и тогда придется делать это во всех строчках, где в качестве атрибута мы имеем Мука в/с. А если мы храним это в отдельной таблице, то только там и надо будет сделать изменения. **************************************** SELECT * FROM Products LEFT JOIN ProductIngredients ON (Products.ProductID = ProductIngredients.ProductID) LEFT JOIN Ingredients ON (ProductIngredients.IngredientsID = Ingredients.IngredientsID) WHERE ProductID = 1;

  • @JohnnySvarog

    @JohnnySvarog

    5 жыл бұрын

    Отличный вопрос! Чтобы правильно сформировать сущность, нужно провести хороший анализ данных, предусмотреть варианты использования таблицы, предвидеть возможные аномалии и прочие подводные камни. Описывать ключ - значит иметь прямое отношение к этому ключу, зависеть от него функционально. Вообще, при нормализации используют понятие естественного ключа. Id - это искусственно созданный ключ, которого нет в природе, а следовательно - и в логической модели данных, он появляется только на физическом уровне (в СУБД). В этом видео Id приведены только для того, чтобы показать, как будет выглядеть таблица в СУБД. Поехали дальше =). Ключ должен однозначно идентифицировать какую-то сущность. Допустим, мы просто добавим в таблицу уникальный id, а остальное оставим как есть. При таком раскладе напрашивается вопрос: что есть этот Id с точки зрения логики? Если мы сделаем выборку SELECT ProductName, Ingredient FROM Tbl WHERE id = 1, что мы получим? Продукт с идентификатором 1? Ингредиент с идентификатором 1? Судя по всему - Ингредиент + Продукт с идентификатором 1. Тогда ингредиент + продукт - это что за двухглавый зверь такой? Можно ли для этого хотябы название придумать? Выходит, что это "Таблица пар ингридиент-продукт". Звучит довольно странно. Если пройти по столбцам, то получаетя, что - ProductName - описывает название некоего Продукта; - Ingredient описывает наименование некоего Ингредиента; - Id - описывает, как мы выяснили, некую "пару Ингредиент-Продукт". Выходит, что ключ живет сам по себе, также как и остальные столбцы. А должно быть, чтобы они логически были связаны. Движемся дальше, допустим, нам нужно изменить наименование продукта "Пирожок с капустой" на "Пирожок с кислой капустой". Как будет выглядеть запрос? UPDATE Tbl SET ProductName = 'Пирожок с кислой капустой' WHERE ProductName= "Пирожок с капустой". Выходит, что у продукта ключ - вовсе не Id, а ProductName, потому что, если менять по ID, то поменяются имена только у части продуктов, которые должны поменяться. Вот вам аномалия обновления. Такая же ситуация и с ингредиентом. Теперь попробуйте то же самое сделать для таблиц Product, Ingredients, которые получились в конце видео. Мы знаем, что у пирожка с капустой есть свой уникальный Id, по которому ему можно найти. Он равен 1. И если мы обновим запись по этому Id, то у ВСЕХ пирожков с капустой поменяется наименование. Чтобы получился более наглядный пример, то представьте лучше таблицу Физ. лицо: Индивидуальный номер(как в паспорте), Имя, Фамилия. Вот тогда станет понятнее. Если вы в паспортном столе сообщите свой индивидуальный номер, то вам скажут точно вашу фамилию и имя, потому что по этому номеру у них всего одна единственная запись. И ваши ФИО - это атрибуты, которые функционально зависят от ИН, другими словами - описывают его. К сожалению, при проектировании БД не всегда можно найти реально существующий уникальный номер, поэтому его создают искусственно. Но в вашей базе для вашей сущности он должен быть так же как ИН в паспортном столе - уникальным и неизменным, для всей системы. По нему таблица будет связана с другими сущностями. Это обеспечит целостность данных и исключит дублирование и прочие неприятные вещи. Ключ - это гарант. Такая штука, по которой 100% можно отличить один предмет от другого. К примеру, если заходишь в деревню, прашиваешь - "где генка живет"? а в ответ - "какой Генка? Кудрявый, что ли?" - значит, в рамках деревни вместо ИИН вполне можно было бы использовать ключ "Погоняло" со значением "Кудрявый" + "Имя" со значением "Генка". Поставить базу данных в сельсовете, и все бы отлично работало до тех пор, пока бы не появился второй Генка Кудрявый, либо пока деревню к какому городу не присоединили, а так как такая вероятность появления есть, то следует выбрать другой ключ, и снова все сводится к ИН. В двух словах - как-то так.

  • @JohnnySvarog

    @JohnnySvarog

    5 жыл бұрын

    Пока писал, удалили вопрос =) Жаль! Был вопрос: "если добавить в таблицу ProductIngredients еще и цену, то можно ли считать, что все три столбца образуют первичный ключ и таблица находится во 2 НФ?" то есть: ProductName, IngredientName, Price? В учебниках по нормализации, возможно скажут, что можно рассматривать "ProductName, IngredientName, Price" как один составной ключ (даже правильнее - ProductName, IngredientName - составной ключ, а Price - обычный не ключевой атрибут), в таком случае, отношение будет не только во 2 НФ но также и в 3НФ (а может и выше, нет времени анализировать), и будет показывать, во сколько фабрике обошелся ингредиент по себестоимости, для каждого продукта. Можно согласиться с тем, что 2НФ не будет нарушена, но только при одном условии: помните, что ключ таблицы - это такая вещь, которая может только добавляться или удаляться, но никак не изменяться. Другими словами, если есть гарантия, что ProdutName, IngridientName никогда, ни при каких условиях не будут меняться - то да, ок. Но что делать, если нужно поменять хоть немного наименование продукта? Если такая возможность МОЖЕТ когда-либо понадобиться в вашем приложении (завтра, через год или в любое время, пока программу не спишут за ненадобностью), то следует пересмотреть структуру. В этом случае, правильная таблица будет - ProductId, IngredientId, Price. Хотя, это уже вопрос даже не нормализации, а больше проектирования БД и анализа данных.

  • @Max-wn2gd

    @Max-wn2gd

    5 жыл бұрын

    @@JohnnySvarog спасибо за подробнейший ответ!

  • @aleksandr977

    @aleksandr977

    4 жыл бұрын

    @@JohnnySvarog "Если вы в паспортном столе сообщите свой индивидуальный номер, то вам скажут точно вашу фамилию и имя, потому что по этому номеру у них всего одна единственная запись. И ваши ФИО - это атрибуты, которые функционально зависят от ИН, другими словами - описывают его." А если есть полный однофамилец - значит по ФИО будет две записи с двумя ИНН. Т. е. скорее всего, как и для деревни, в налоговой используется еще какой-то идентификатор? И еще, в этом случае с однофамильцем, значит ли это что, атрибуты не "описывают первичный ключ целиком"? формулировка режет слух, может с непривычки?(((

  • @yarik7432
    @yarik74323 жыл бұрын

    У тебя нет видео которая объясняет эту тему вот так F = {A→C, BC→AG, BG→E, CE→B, D→H, G→A}? То что ты рассказал очень хорошо понял, но вот эту систему объяснения по которой у меня экзамен будет через 2 недели, и вопросы будут поставлены как я описал выше, никак понять не могу, если бы было как на видео то даже не волновался бы

  • @Sharp221

    @Sharp221

    3 жыл бұрын

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

  • @user-lc2yc8of2m
    @user-lc2yc8of2m5 жыл бұрын

    Разве можно сказать про таблицу ingredients что она приведена к 2НФ? Ведь, vendor contact не описывает пк вообще никак, а уловие 2НФ, все атрибуты должны описывать пк целиком.

  • @JohnnySvarog

    @JohnnySvarog

    5 жыл бұрын

    В случае второй формы, трактовать нужно так: а) первичный ключ ДОЛЖЕН БЫТЬ. Проверяем себя: есть? есть! б) все атрибуты должны описывать первичный ключ ЦЕЛИКОМ, а НЕ ЧАСТЬ первичного ключа. Здесь смотрим, сколько столбцов в ключе, если больше одного - то проверяем, нет ли каких-либо зависимостей от части ключа. Если один - то зеленый свет. Что касается Vendor contact: описывать-то ключ - он описывает, в том плане, если id 2, то мы знаем, что, в случае чего, то писать на мейл 2@example.com. А вот дальше - вы правы, есть неоднозначность. В зависимости от того, какой смысл вкладывается в понятие contact, эта таблица может даже не соответствовать 1 НФ, не говоря о второй (этот пример разбирается здесь: kzread.info/dash/bejne/oItqzZeomrincbg.html). А вот тот факт, что VendorContact зависит от другого неключевого атрибута - это уже критерий 3НФ (ссылка также в описании).

  • @user-lc2yc8of2m

    @user-lc2yc8of2m

    5 жыл бұрын

    @@JohnnySvarog спасибо за ответ

  • @andrewkruchini8614
    @andrewkruchini86143 жыл бұрын

    Не понимаю восторга комментаторов, т.к. лектор, похоже, сам не до конца понимает теорию. Вернее, понимаю намерение объяснить "на пальцах" сложные для кого-то вещи и снимаю шляпу, но не могу удержаться от замечания. Дело в том, что таблица, перекочевавшая их первого урока про 1НФ, уже находится во 2НФ: 1) Таблица находится в 1НФ (показано в предыдущем уроке) 2) У таблицы должен быть первичный ключ (здесь есть, это составной ключ (Product_Name, Ingredient) - натуральный ключ) 3) Все атрибуты должны описывать первичный ключ целиком, а не какую-то часть первичного ключа (здесь вся таблица по сути состоит только из первичных составных ключей, нет неключевых атрибутов, как и у третьей таблицы в финальном примере) Требование, что первичный ключ должен состоять только из целочисленных значений, существует только в голове автора. Тип атрибутов составного ключа может быть любым. ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B2%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BB%D1%8E%D1%87 Наличие суррогатных ключей, которые потом добавил автор, совсем не обязательно, это - вопрос удобства и эффективности, но в данном случае не имеет отношения к нормализации ru.wikipedia.org/wiki/%D0%A1%D1%83%D1%80%D1%80%D0%BE%D0%B3%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BB%D1%8E%D1%87 А вот когда он добавил в эту таблицу атрибуты Product_Id и Ingredient_Id, эта таблица перестала соответствовать 2НФ, и дальнейшие рассуждения имеют смысл.

  • @andrewtvorogov691

    @andrewtvorogov691

    3 жыл бұрын

    именно. таблица изначально во второй форме. в финале видео заменили ее на аналог из id.

  • @wob03omsan38

    @wob03omsan38

    3 жыл бұрын

    Вот да. Ну, понятно, это сделано для того, чтобы как можно проще всё объяснить. Ещё чисто субъективно не нравится слово "описывать", скорее "зависеть" они должны или "относиться".

  • @user-qr3wz4kk1b
    @user-qr3wz4kk1b4 жыл бұрын

    я б таки хотел уточнить про таблицу привязки, она по правил не во 2-ой нормальной форме а в 1-ой, у нее нет ее собственного primary key, или я не прав?

  • @JohnnySvarog

    @JohnnySvarog

    4 жыл бұрын

    у product_ingredients ключ - [Ingredient_id, product_id]

  • @makam6750

    @makam6750

    4 жыл бұрын

    @@JohnnySvarog но ведь, когда в таблице есть primary key,, значения не могут посторяться. Выходит это внешний ключ?

  • @JohnnySvarog

    @JohnnySvarog

    4 жыл бұрын

    @@makam6750 Когда мы говорим о нормализации, мы рассматриваем каждую таблицу (отношение) в отдельности. Внешних ключей здесь нет. Понятие "внешний ключ" возникнет, когда вы из этих нарисованных на бумаге таблиц создадите физические таблицы в БД и свяжете их через foreign key. Ingredient_Id будет foreign key с ссылкой на primary key таблицы ингредиентов, Product_Id- на таблицу продуктов. Вместе эти два бравых товарища образуют составной primary key таблицы. Условно, навесят на него CONSTRAINT Products_Ingredients_PK PRIMARY KEY (Product_ID, Ingredient_ID). И все.

  • @ilyayuriev8492
    @ilyayuriev84924 жыл бұрын

    Не пойму, чем первая таблица в начале, отличается от третей в конце?

  • @JohnnySvarog

    @JohnnySvarog

    4 жыл бұрын

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

  • @SolistTV
    @SolistTV4 жыл бұрын

    У таблицы связей продуктов и ингридиентов разве не должно быть авто инкремента?

  • @Spin-2O

    @Spin-2O

    4 жыл бұрын

    Мне тоже так думается, что должен быть отдельный первичный ключ, иначе это не 2НФ. Ведь ID продукта или ингредиента можно рассматривать не только как ключевые поля, но и как поля данных.

  • @JohnnySvarog

    @JohnnySvarog

    4 жыл бұрын

    Автоинкремент - это физический уровень базы данных. Нормализация выполняется на логическом уровне, ей интересны лишь таблицы и связи между ними. Но даже в физической БД помимо полей Ingredient_Id, Product_Id дополнительных полей не нужно.

  • @ZEXthn

    @ZEXthn

    2 жыл бұрын

    Ingredient_id и product_id это и есть автоинкременты.

  • @user-ni4vw6yw8b
    @user-ni4vw6yw8b5 жыл бұрын

    Хоть кто-то нормально все обьяснил. Ф то умников много, а сказать толком ничего не могут. Спасибо!

  • @abuddabi
    @abuddabi4 жыл бұрын

    что здесь атрибуты? атрибут == значение каждой отдельной ячейки? UPD: А, атрибуты это столбцы.. Правильно я понял?

  • @JohnnySvarog

    @JohnnySvarog

    4 жыл бұрын

    в общем, да атрибуты сущности - это столбцы таблицы. Атрибуты - термин из Entity-Relationship

  • @wob03omsan38
    @wob03omsan383 жыл бұрын

    А вот за "Весёлого не***а" по нынешним временам может и прилететь;)

  • @gheorghecasian3218
    @gheorghecasian32182 жыл бұрын

    We Beiu

  • @gobelenikym8550
    @gobelenikym85502 жыл бұрын

    Абоба

  • @FrancisFordCoppala
    @FrancisFordCoppalaКүн бұрын

    я нихуя не понял

  • @iltfuande8321
    @iltfuande83212 жыл бұрын

    Веселый негр хывахывхфахвппхавыазрпхваызп

  • @FrancisFordCoppala
    @FrancisFordCoppalaКүн бұрын

    переделывай

  • @Vlad1998996
    @Vlad19989962 жыл бұрын

    Скомкано но понятно.

Келесі