Changes between Version 21 and Version 22 of Normalization
- Timestamp:
- 08/06/26 12:41:58 (34 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Normalization
v21 v22 27 27 tag_translate_id, tag_value ) 28 28 }}} 29 30 '''Забелешка за јазикот:''' Во претходната верзија секоја релација за превод носеше сопствен атрибут за јазик (course_translate_language, content_translate_language, lecture_language, tag_translate_language). Во новиот модел јазикот е самостоен ентитет (Language), па сите четири релации за превод упатуваат кон истиот атрибут language_id. Во универзалната релација тоа значи дека една торка ги содржи преводите на еден ист јазик.31 32 '''Забелешка за сметките:''' Атрибутите за најава (email, password_hash, name) се издвоени во ентитетот Account. Затоа Expert повеќе не носи сопствени атрибути за име и мејл, туку само упатување кон Account.33 29 34 30 ---- … … 73 69 * '''FD33:''' meeting_link → meeting_reminder_id 74 70 '''}''' 75 76 '''Забелешка:''' FD6 го содржи payment_id на десната страна бидејќи ограничувањето `uq_payment_enrollment` дозволува најмногу една наплата по запишување. FD33 произлегува од ограничувањето `uq_meeting_email_reminder_link`. FD30 произлегува од `uq_account_email`, а FD32 од `uq_language_value`.77 71 78 72 ---- … … 169 163 170 164 * '''verification_token_uuid''' - мора да биде дел од секој кандидат клуч 165 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD33) 171 166 * '''expert_id''' - мора да биде дел од секој кандидат клуч 172 167 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч 173 168 * '''user_favorite_course_ids''' - мора да биде дел од секој кандидат клуч 174 175 '''Меѓусебно зависни парови:''' Атрибутите meeting_reminder_id и meeting_link меѓусебно се определуваат (FD3 и FD33), а ниту еден друг атрибут не ги определува. Затоа точно еден од нив мора да биде дел од секој кандидат клуч; го избираме meeting_reminder_id. Истото важи и за парот account_id и account_email, но тие се достапни преку FD1 од user_id, па не мора да бидат во клучот.176 169 177 170 === 3.4 Пресметка на затворач === … … 422 415 == 5. 2NF Декомпозиција == 423 416 424 '''Забелешка за надворешните клучеви:''' При секоја декомпозиција, атрибутот кој служи како надворешен клуч (account_id, language_id, course_id, course_content_id, ...) се пренесува во новата релација, но останува и во базната релација сè додека не се извлече неговиот сопствен ентитет.425 426 417 === Чекор 5.1: Декомпозиција по FD2 (verification_token_uuid → ...) === 427 418 … … 776 767 * meeting_reminder_id → user_id → user_*? 777 768 * user_* атрибутите НЕ се во Meeting_Reminder. 778 * meeting_link → meeting_reminder_id (FD33) е зависност кон клучот, не транзитивна зависност.779 769 780 770 '''Заклучок:''' Meeting_Reminder е во 3NF ✓ … … 917 907 ) 918 908 }}} 919 920 '''Забелешка:''' payment_id и review_id се дел од десната страна на FD6 (заради ограничувањата `uq_payment_enrollment` и `uq_review_enrollment`), но не се внесуваат како атрибути во Enrollment. Наместо тоа, врската се чува преку enrollment_id во Payment и Review, што ја избегнува циклична зависност помеѓу трите релации.921 909 922 910 '''Проверка за lossless join:''' Може да се реконструира преку enrollment_id … … 1171 1159 ||= FD =||= Детерминант =||= Суперклуч? =|| 1172 1160 || account_id → сите || account_id || ✓ ДА || 1173 || account_email → сите (FD30) || account_email || ✓ ДА ||1174 1161 1175 1162 '''Account е во BCNF''' ✓ … … 1179 1166 ||= FD =||= Детерминант =||= Суперклуч? =|| 1180 1167 || language_id → сите || language_id || ✓ ДА || 1181 || language_value → сите (FD32) || language_value || ✓ ДА ||1182 1168 1183 1169 '''Language е во BCNF''' ✓ … … 1194 1180 ||= FD =||= Детерминант =||= Суперклуч? =|| 1195 1181 || meeting_reminder_id → сите || meeting_reminder_id || ✓ ДА || 1196 || meeting_link → сите (FD33) || meeting_link || ✓ ДА ||1197 1182 1198 1183 '''Meeting_Reminder е во BCNF''' ✓ … … 1209 1194 ||= FD =||= Детерминант =||= Суперклуч? =|| 1210 1195 || tag_translate_id → сите || tag_translate_id || ✓ ДА || 1211 || (tag_id, language_id) → сите (FD24) || tag_id, language_id || ✓ ДА ||1212 1196 1213 1197 '''Tag_Translate е во BCNF''' ✓ … … 1217 1201 ||= FD =||= Детерминант =||= Суперклуч? =|| 1218 1202 || course_translate_id → сите || course_translate_id || ✓ ДА || 1219 || (course_id, language_id) → сите (FD21) || course_id, language_id || ✓ ДА ||1220 1203 1221 1204 '''Course_Translate е во BCNF''' ✓ … … 1225 1208 ||= FD =||= Детерминант =||= Суперклуч? =|| 1226 1209 || course_content_translate_id → сите || course_content_translate_id || ✓ ДА || 1227 || (course_content_id, language_id) → сите (FD23) || course_content_id, language_id || ✓ ДА ||1228 1210 1229 1211 '''Course_Content_Translate е во BCNF''' ✓ … … 1233 1215 ||= FD =||= Детерминант =||= Суперклуч? =|| 1234 1216 || course_lecture_translate_id → сите || course_lecture_translate_id || ✓ ДА || 1235 || (course_lecture_id, language_id) → сите (FD22) || course_lecture_id, language_id || ✓ ДА ||1236 1217 1237 1218 '''Course_Lecture_Translate е во BCNF''' ✓ … … 1241 1222 ||= FD =||= Детерминант =||= Суперклуч? =|| 1242 1223 || user_course_progress_id → сите || user_course_progress_id || ✓ ДА || 1243 || (enrollment_id, course_lecture_id) → сите (FD25) || enrollment_id, course_lecture_id || ✓ ДА ||1244 1224 1245 1225 '''User_Course_Progress е во BCNF''' ✓ … … 1249 1229 ||= FD =||= Детерминант =||= Суперклуч? =|| 1250 1230 || user_id → сите || user_id || ✓ ДА || 1251 || user_email → сите (FD18) || user_email || ✓ ДА ||1252 1231 1253 1232 '''User е во BCNF''' ✓ … … 1271 1250 ||= FD =||= Детерминант =||= Суперклуч? =|| 1272 1251 || payment_id → сите || payment_id || ✓ ДА || 1273 || enrollment_id → сите (FD6) || enrollment_id || ✓ ДА ||1274 1252 1275 1253 '''Payment е во BCNF''' ✓ … … 1279 1257 ||= FD =||= Детерминант =||= Суперклуч? =|| 1280 1258 || review_id → сите || review_id || ✓ ДА || 1281 || enrollment_id → сите (FD6) || enrollment_id || ✓ ДА ||1282 1259 1283 1260 '''Review е во BCNF''' ✓ … … 1294 1271 ||= FD =||= Детерминант =||= Суперклуч? =|| 1295 1272 || course_version_id → сите || course_version_id || ✓ ДА || 1296 || (course_id, version_number) → сите (FD20) || course_id, version_number || ✓ ДА ||1297 1273 1298 1274 '''Course_Version е во BCNF''' ✓ … … 1302 1278 ||= FD =||= Детерминант =||= Суперклуч? =|| 1303 1279 || course_content_id → сите || course_content_id || ✓ ДА || 1304 || (course_version_id, content_position) → сите (FD26) || course_version_id, content_position || ✓ ДА ||1305 1280 1306 1281 '''Course_Content е во BCNF''' ✓ … … 1310 1285 ||= FD =||= Детерминант =||= Суперклуч? =|| 1311 1286 || course_lecture_id → сите || course_lecture_id || ✓ ДА || 1312 || (course_content_id, lecture_position) → сите (FD27) || course_content_id, lecture_position || ✓ ДА ||1313 1287 1314 1288 '''Course_Lecture е во BCNF''' ✓ … … 1493 1467 1. '''Процесот на нормализација го потврди најголемиот дел од дизајнот''' - секоја декомпозиција базирана на функционалните зависности резултираше со релација која одговара на ентитет од оригиналниот модел, освен во три случаи: Account, Language и намалениот Expert. 1494 1468 1495 2. '''Клучот на универзалната релација''' - примарниот клуч беше идентификуван како композитен клуч од 10 атрибути: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите. По 1NF декомпозицијата, атрибутите course_what_will_be_learned и user_favorite_course_ids се извлекуваат, па клучот на базната релација се сведува на 8 атрибути.1469 2. '''Клучот на универзалната релација''' - примарниот клуч беше идентификуван како композитен клуч од 10 атрибути: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите. 1496 1470 1497 1471 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys). … … 1501 1475 5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys. 1502 1476 1503 6. '''Издвојувањето на Account''' - оваа релација произлезе од функционалните зависности FD19 и FD30, кои не постоеја во P2. Во P2 атрибутите за најава беа дуплирани во User и Expert, што претставува редундантност: промена на лозинка би барала ажурирање на две релации.1504 1505 1477 ==== Заклучок ==== 1506 1478 1507 Процесот на нормализација '''го потврди најголемиот дел од дизајнот''' од концептуалната фаза (P2) , но воведе и три разлики: издвојување на Account, издвојување на Language и намалување на Expert. Ова покажува дека оригиналниот ER модел беше во голема мера креиран според принципите на добра база на податоци (минимална редундантност, јасна сепарација на концепти, правилна идентификација на ентитети и релации), но дека дуплираните атрибути за најава и текстуалниот атрибут за јазик беа извори на редундантност кои нормализацијата ги отстрани.1479 Процесот на нормализација '''го потврди најголемиот дел од дизајнот''' од концептуалната фаза (P2). Ова покажува дека оригиналниот ER модел беше во голема мера креиран според принципите на добра база на податоци (минимална редундантност, јасна сепарација на концепти, правилна идентификација на ентитети и релации). 1508 1480 1509 1481 '''Финалниот релационен модел се разликува од моделот од Фаза P2 во три релации: Account, Language и Expert'''.
