Changes between Version 16 and Version 17 of normalization
- Timestamp:
- 01/30/26 11:21:48 (3 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
normalization
v16 v17 7 7 {{{ 8 8 Universal_Relation_Shifter( 9 user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, 9 user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, user_course_favorite_ids, 10 10 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, 11 11 expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash, … … 63 63 * '''FD27:''' (course_content_id, lecture_position) → course_lecture_id 64 64 * '''FD28:''' (course_translate_id, course_what_will_be_learned) → ∅ 65 * '''FD29:''' (user_id, user_course_favorite_ids) → ∅ 65 66 '''}''' 66 67 … … 87 88 || user_work_position || ✗ || ✓ (FD1) || десно || 88 89 || user_points || ✗ || ✓ (FD1) || десно || 90 || user_course_favorite_ids || ✓ (FD29) || ✗ || лево || 89 91 || verification_token_uuid || ✓ (FD2) || ✗ || лево || 90 92 || token_created_at || ✗ || ✓ (FD2) || десно || … … 163 165 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч 164 166 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч 167 * '''user_course_favorite_ids''' - мора да биде дел од секој кандидат клуч 165 168 166 169 === 3.4 Пресметка на затворач === 167 170 168 '''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned } и пресметуваме затворач:169 170 {{{ 171 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned }⁺:171 '''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids} и пресметуваме затворач: 172 173 {{{ 174 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺: 172 175 - Од FD2 (verification_token_uuid →): добиваме token_created_at, token_expired_at, user_id 173 176 - Од FD3 (meeting_reminder_id →): добиваме meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id … … 176 179 }}} 177 180 178 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned }⁺ ≠ Universal_Relation_Shifter'''181 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺ ≠ Universal_Relation_Shifter''' 179 182 180 183 '''Недостасуваат:''' … … 197 200 198 201 {{{ 199 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id}⁺:202 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id}⁺: 200 203 - Сè од претходно, плус: 201 204 - Од FD6 (user_course_progress_id →): добиваме progress_completed, progress_completed_at, enrollment_id, course_lecture_id … … 209 212 }}} 210 213 211 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id}⁺ ≠ Universal_Relation_Shifter'''214 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id}⁺ ≠ Universal_Relation_Shifter''' 212 215 213 216 '''Недостасуваат:''' … … 222 225 223 226 {{{ 224 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺:227 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺: 225 228 - Сè од претходно, плус: 226 229 - Од FD4 (expert_id →): добиваме expert_name, expert_email, expert_login_provider, expert_password_hash … … 233 236 }}} 234 237 235 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓238 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓ 236 239 237 240 === 3.5 Проверка за минималност === 238 241 239 242 ||= Подмножество =||= Затворач =||= = Universal_Relation_Shifter? =|| 240 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned }⁺ || Недостасуваат атрибути од user_course_progress || ✗ НЕ ||241 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress}⁺ || Недостасуваат атрибути од expert || ✗ НЕ ||242 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ ||243 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ ||244 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ ||245 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ ||246 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id, tag_translate_id}⁺ || Сите атрибути се присути || ✓ ДА ||247 248 '''Заклучок:''' {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч.243 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺ || Недостасуваат атрибути од user_course_progress || ✗ НЕ || 244 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress}⁺ || Недостасуваат атрибути од expert || ✗ НЕ || 245 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ || 246 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ || 247 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ || 248 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ || 249 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id, tag_translate_id}⁺ || Сите атрибути се присути || ✓ ДА || 250 251 '''Заклучок:''' {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч. 249 252 250 253 === 3.6 Други кандидат клучеви === … … 254 257 === 3.7 Избор на примарен клуч === 255 258 256 '''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_ progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}'''259 '''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}''' 257 260 258 261 '''Образложение:''' … … 279 282 280 283 Universal_Relation_Shifter_Base( 281 user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, 284 user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, user_course_favorite_ids, 282 285 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, 283 286 expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash, … … 297 300 tag_translate_id, tag_translate_language, tag_value 298 301 ) 299 PK: {verification_token_uuid, meeting_reminder_id, user_course_ progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}302 PK: {verification_token_uuid, meeting_reminder_id, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} 300 303 }}} 301 304 … … 303 306 '''Проверка за dependency preservation:''' FD28 е зачувана во Course_What_Will_Be_Learned 304 307 305 306 === 4.2 Проверка која FD ја нарушува 2NF === 308 === Чекор 4.2: Декомпозиција на релацијата Universal_Relation_Shifter === 309 310 '''Нарушува 1NF: '''Релацијата не е во 1NF бидејќи атрибутот user_course_favorite_ids претставува повеќевредносен (multi-valued) атрибут. Секој user може да има повеќе ставки од user_course_favorite_ids. 311 312 '''Декомпозиција:''' 313 314 {{{ 315 User_Course_Favorite_Id(user_id, user_course_favorite_id) 316 PK: {user_id, user_course_favorite_id} 317 318 Universal_Relation_Shifter_Base = Universal_Relation_Shifter - {user_course_favorite_ids} 319 320 Universal_Relation_Shifter_Base( 321 user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, 322 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, 323 expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash, 324 course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, 325 course_version_id, version_number, version_creation_date, version_active, 326 enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, 327 payment_id, payment_amount, payment_date, payment_method, payment_status, 328 review_id, review_rating, review_comment, review_date, 329 course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, 330 course_content_id, content_position, 331 course_content_translate_id, content_translate_title, content_translate_language, 332 course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, 333 course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, 334 user_course_progress_id, progress_completed, progress_completed_at, 335 verification_token_uuid, token_created_at, token_expired_at, 336 tag_id, tag_type, 337 tag_translate_id, tag_translate_language, tag_value 338 ) 339 PK: {verification_token_uuid, meeting_reminder_id, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} 340 }}} 341 342 '''Проверка за lossless join:''' Може да се реконструира преку user_id <br> 343 '''Проверка за dependency preservation:''' FD29 е зачувана во User_Course_Favorite_Id 344 345 346 === 4.3 Проверка која FD ја нарушува 2NF === 307 347 308 348 За да биде во 2NF, секој не-клучен атрибут мора целосно да зависи од примарниот клуч (нема парцијални зависности). … … 627 667 628 668 {{{ 669 User_Course_Favorite_Id(user_id, user_course_favorite_id) 670 PK: {user_id, user_course_favorite_id} 671 629 672 Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned) 630 673 PK: {course_translate_id, course_what_will_be_learned} … … 972 1015 ||= Релација =||= Атрибути =||= Примарен клуч =|| 973 1016 || Course_What_Will_Be_Learned || course_translate_id, course_what_will_be_learned || (course_translate_id, course_what_will_be_learned) || 1017 || User_Course_Favorite_Id || user_id, user_course_favorite_id || (user_id, user_course_favorite_id) || 974 1018 975 1019 '''2NF Декомпозиција (8 релации):''' … … 1139 1183 1140 1184 {{{ 1185 User_Course_Favorite_Id(user_id, user_course_favorite_id) 1186 - Примарен клуч: user_id, user_course_favorite_id 1187 - Кандидат клучеви: user_id, user_course_favorite_id 1188 - Надворешни клучеви: user_id 1189 1141 1190 Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned) 1142 1191 - Примарен клуч: course_translate_id, course_what_will_be_learned … … 1247 1296 === 8.2 Дискусија на разликите од моделот во Фаза P2 === 1248 1297 1249 Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''2 1релации'''1250 (17 од функционални зависности + 3 many-to-many junction tables + 1 multi-value). Споредбата со концептуалниот модел1298 Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''22 релации''' 1299 (17 од функционални зависности + 3 many-to-many junction tables + 2 multi-value tables). Споредбата со концептуалниот модел 1251 1300 од Фаза P2 покажува следно: 1252 1301 … … 1282 1331 1283 1332 21. '''Course_What_Will_Be_Learned''' - беше дел од Course_Translate во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден курс има повеќе "what will be learned" ставки). 1333 22. '''User_Course_Favorite_Id''' - беше дел од User во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден корисник има повеќе "course favorite id" ставки). 1284 1334 1285 1335 ==== Клучни наоди ==== … … 1291 1341 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys). 1292 1342 1293 4. '''Сите функционални зависности се зачувани''' - сите 2 7 функционални зависности (FD1-FD27) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.1343 4. '''Сите функционални зависности се зачувани''' - сите 29 функционални зависности (FD1-FD29) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции. 1294 1344 1295 1345 5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys.
