wiki:Normalization

Функциски зависности

Атрибутите name и surname кај users се споени во user_fullname.
Атрибутите name и surname кај persons се споени во person_fullname.

FD = { movie_title -> movie_id, movie_title -> movie_description, movie_title -> movie_image_url, movie_title -> airing_date, movie_title -> imdb_rating, movie_title -> discussion_type, movie_id -> movie_title, movie_id -> movie_description, movie_id -> movie_image_url, movie_id -> airing_date, movie_id -> imdb_rating, movie_id -> discussion_type,

user_id -> username, user_id -> user_fullname, user_id -> email, user_id -> password, username -> user_id, username -> user_fullname, username -> email, username -> password,

email -> user_id, email -> user_fullname, email -> username, email -> password,

person_id -> person_fullname, person_id -> person_type, person_id -> date_of_birth, person_id -> person_image_url, person_id -> person_description, person_id -> discussion_type,

genre_id -> genre_type, genre_type -> genre_id, movie_id user_id -> movie_reason, movie_id user_id -> movie_stars_rated, person_id user_id -> person_reason, person_id user_id -> person_stars_rated, discussion_id -> discussion_type, discussion_id -> discussion_text, discussion_id -> discussion_title, discussion_id -> date, discussion_id -> movie_id, discussion_id -> person_id, discussion_id reply_id -> reply_text, discussion_id reply_id -> reply_date }

Fc = { movie_title -> movie_id, movie_id -> movie_title, movie_id -> movie_description, movie_id -> movie_image_url, movie_id -> airing_date, movie_id -> imdb_rating, movie_id -> discussion_type, user_id -> username, user_id -> user_fullname, user_id -> email, user_id -> password, username -> user_id, email -> user_id, person_id -> person_fullname, person_id -> person_type, person_id -> date_of_birth, person_id -> person_image_url, person_id -> person_description, person_id -> discussion_type, genre_id -> genre_type, genre_type -> genre_id, discussion_id -> discussion_type, discussion_id -> discussion_text, discussion_id -> discussion_title, discussion_id -> date, discussion_id -> movie_id, discussion_id -> person_id, discussion_id reply_id -> reply_text, discussion_id reply_id -> reply_date }

Нормална форма на актуелен дизајн

Базата се наоѓа во 2 нормална форма бидејќи во табелаа Discussions, има неколку транзитивни зависности на кандидат клуч со непримарен атрибут, конкретно discussion_id -> person_id person_id -> discussion_type, discussion_id -> movie_id movie_id -> discussion_type, discussion_id -> person_id person_id -> movie_id, discussion_id -> movie_id movie_id -> person_id . Според горните функциски зависности и дизајнот, базата е во 1 нормална форма поради тоа што кај табелата Movies, кандидат клучот мора да го соддржи и надворешниот клуч(кон него нема функциска зависност) и истиот клуч разложен, има парцијални функциски зависности кон непримарни атрибути. Не постојат повеќевредносни атрибути. Освен во табелата Movies, исто не постои функциска зависност кон надворешниот клуч и во останатите табели.

Декомпозиција

R={ person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description, movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date, username, user_id, user_fullname, password, email, genre_id, genre_type, discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, person_stars_rated, person_reason, movie_stars_rated, movie_reason, reply_id, reply_text, reply_date }

person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description, movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date, username, user_id, user_fullname, password, email, genre_id, genre_type, discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, person_stars_rated, person_reason, movie_stars_rated, movie_reason, reply_id, reply_text, reply_date + = { person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description, movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date, username, user_id, user_fullname, password, email, genre_id, genre_type, discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, person_stars_rated, person_reason, movie_stars_rated, movie_reason, reply_id, reply_text, reply_date } - супер клуч кој што е составен од сите атрибути што еднозначно би идентификувал редица во табелата.

movie_id, user_id, person_id, genre_id, discussion_id, reply_id + = { person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description, movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date, username, user_id, user_fullname, password, email, genre_id, genre_type, discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, person_stars_rated, person_reason, movie_stars_rated, movie_reason, reply_id, reply_text, reply_date } - супер клуч аплициран со сите функциски зависности на атрибутите од лева страна.

movie_id, user_id, person_id, genre_id, discussion_id, reply_id - претставува кандидат клуч бидејќи ниту едно подмножество на овој супер клуч, неговиот затварач не ги идентификува сите останати атрибути. Овој не е единствен, поради тоа што, дел од атрибутите од овој клуч, имаат и функциски зависности и кон нив.

movie_id, user_id, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет genre_id поради genre_type -> genre_id.

movie_title, user_id, person_id, genre_id, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id.

movie_title, user_id, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id и заменет genre_id поради genre_type -> genre_id.

movie_id, username, person_id, genre_id, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет user_id поради username -> user_id.

movie_id, email, person_id, genre_id, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет user_id поради email -> user_id.

movie_title, username, person_id, genre_id, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id и заменет user_id поради username -> user_id.

movie_title, email, person_id, genre_id, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id и заменет user_id поради email -> user_id.

movie_title, username, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id, заменет user_id поради username -> user_id и заменет genre_id поради genre_type -> genre_id.

movie_title, email, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет movie_id поради movie_title -> movie_id и заменет user_id поради email -> user_id и заменет genre_id поради genre_type -> genre_id.

movie_id, username, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет user_id поради username -> user_id и заменет genre_id поради genre_type -> genre_id.

movie_id, email, person_id, genre_type, discussion_id, reply_id - супер клуч, воедно и кандидат клуч, заменет user_id поради email -> user_id и заменет genre_id поради genre_type -> genre_id.

Примарни атрибути = { movie_id, user_id, person_id, genre_id, discussion_id, reply_id, genre_type, username, movie_title, email }

Од горните зависности, може да се воочи дека постојат парцијални функциски зависности од сите атрибути посебно од кандидат клучот. Мора да се разложи во посебни табели за да бидат задоволени правилата за 2 нормална форма. Ќе се креира посебна табела за genre_id и genre_type, посебна табела за person_id и со сите атрибути произлезени од неговите функциски зависности освен discussion_type, посебна табела за movie_id заедно со сите атрибути произлезени од функцискисте зависности освен discussion_type, посебна табела за user_id заедно со сите атрибути произлезени од нивните функциски зависности, посебна табела за user_id и movie_id заедно со movie_reason и movie_stars_rated, посебна табела за user_id и person_id заедно со person_reason и person_stars_rated, посебна табела за discussion_id и сите атрибути добиени од нивните функциски зависности, посебна табела за discussion_id и reply_id заедно со атрибутите добиени од нивните функциски зависности.

R1(genre_id, genre_type)
R2(person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description)
R3(movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date)
R4(username, user_id, user_fullname, password, email)
R5(user_id, person_id, person_stars_rated, person_reason)
R6(user_id, movie_id, movie_stars_rated, movie_reason)
R7(discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, movie_id, person_id)
R8(discussion_id, reply_id, reply_text, reply_date)

Сепак, со овие горе табели, нема да може да има спојување на табелите засегнати со жанрот, а тоа се R3 и R4. Кандидат клучевите на R3 и R4 не повлекуваат функциски зависности кон кандидат клуч на R1, па затоа ќе треба да постојат, уште две посебни табели, во кои кандидат клуч ќе биде соодветни комбинации од кандидат клуч на R1 и R3, како и R1 и R4. Може да постои само R9 или R10 за да спојувањето биде успешно, не постои функциска зависност заведена погоре, но истото нема да резултира со побарувањата на базата од ЕР дијаграмот.

R9(genre_id, movie_id)
R10(genre_id, user_id)

9 табели се добиваат врз база на функциските зависности.

Спојувањето ќе биде успешно и се запазени функциските зависности за 2 нормална форма.

R1(genre_id, genre_type) - BCNF поради тоа што genre_id и genre_type се кандидат клучеви, односно супер клучеви, во оваа табела.
R2(person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description) - BCNF, функциските зависности доаѓаат само од person_id што е кандидат клуч.
R3(movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date) - BCNF, функциските зависности доаѓаат само од кандидат клучевите.
R4(username, user_id, user_fullname, password, email) - BCNF, функциските зависности доаѓаат само од кандидат клучевите.
R5(user_id, person_id, person_stars_rated, person_reason) - BCNF, не постојат нетривијални функциски зависности без да биде вклучен кандидат клучот.
R6(user_id, movie_id, movie_stars_rated, movie_reason) - BCNF, не постојат нетривијални функциски зависности без да биде вклучен кандидат клучот.
R7(discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, movie_id, person_id) - 2 нормална форма постојат транзитивни функциски зависности на discussion_id произлезени од movie_id и person_id кои што не се кандидат клучвеи во оваа табела. Мора оваа табела да се разложи на 3 табели.
R71(discussion_id, discussion_text, discussion_title, discussion_date, movie_id, person_id) - BCNF, сите функциски зависности потекнуваат од кандидат клуч.
R72(movie_id, discussion_type) - BCNF, сите функциски зависности потекнуваат од кандидат клуч.
R73(person_id, discussion_type) - BCNF, сите функциски зависности потекнуваат од кандидат клуч.

R8(discussion_id, reply_id, reply_text, reply_date) - BCNF, не постојат нетривијални функциски зависности без да биде вклучен кандидат клучот.

Според ова, сите табели се во BCNF, па нормализацијата е во BCNF со 11 табели.

Дополнително, побарувањата на ЕР дијаграмот не се целосно застапени, односно не постои табела за допаѓања на филмови, табела за допаѓања на дискусии и табела за допаѓања на реплики бидејќи не постојат функциски зависности од погоре. Исто и за креатор на реплика и дискусија, а воедно на филмот неговиот режисер, ќе мора да се во посебни табели, од аспект, повторно на функциските зависности, кои не постојат меѓусебно. Во R14, иако глобално не постои зависност кон person_id, сепак за да се задоволат барањата на ЕР дијаграмот, ќе биде креиарана нова табела која ќе репрезентира режисер на соодветниот филм. R17 претставува табела на актери во филмот.

R11(user_id, movie_id)
R12(user_id, discussion_id)
R13(user_id, discussion_id, reply_id)
R14(movie_id, person_id)
R15(user_id, discussion_id)
R16(user_id, discussion_id, reply_id)
R17(movie_id, person_id)

Во приказ е дадено преименување на R во соодветни табели:

R1(genre_id, genre_type) - Genres(genre_id, genre_type)
R2(person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description) - Persons(person_id, person_fullname, person_type, date_of_birth, person_image_url, person_description)
R3(movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date) - Movies(movie_id, movie_title, movie_description, movie_image_url, imdb_rating, airing_date)
R4(username, user_id, user_fullname, password, email) - Users(username, user_id, user_fullname, password, email)
R5(user_id, person_id, person_stars_rated, person_reason) - Users_rate_persons(user_id, person_id, person_stars_rated, person_reason)
R6(user_id, movie_id, movie_stars_rated, movie_reason) - Users_rate_movies(user_id, movie_id, movie_stars_rated, movie_reason)
R71(discussion_id, discussion_text, discussion_title, discussion_date, movie_id, person_id) - Discussions(discussion_id, discussion_type, discussion_text, discussion_title, discussion_date, movie_id, person_id)
R72(movie_id, discussion_type) - Movies_discussion_type(movie_id, discussion_type)
R73(person_id, discussion_type) - Persons_discussion_type(person_id, discussion_type)

R8(discussion_id, reply_id, reply_text, reply_date) - Replies(discussion_id, reply_id, reply_text, reply_date)
R9(genre_id, movie_id) - Movies_from_genres(genre_id, movie_id)
R10(genre_id, user_id) - Users_like_genres(genre_id, user_id)

R11(user_id, movie_id) - Users_like_movies(user_id, movie_id)
R12(user_id, discussion_id) - Users_like_discussions(user_id, discussion_id)
R13(user_id, discussion_id, reply_id) - Users_like_replies(user_id, discussion_id, reply_id)
R14(movie_id, person_id) - Person_is_director_in_movies(movie_id, person_id)
R15(user_id, discussion_id) - Users_created_discussions(user_id, discussion_id)
R16(user_id, discussion_id, reply_id) - Users_created_replies(user_id, discussion_id, reply_id)
R17(movie_id, person_id) - Persons_are_actors_in_movies(movie_id, person_id)

Last modified 2 years ago Last modified on 03/09/22 00:28:13
Note: See TracWiki for help on using the wiki.