| 967 | | || '''Verification_Token''' || token_created_at, token_expired_at, user_id || verification_token_uuid || |
| 968 | | || '''Meeting_Reminder''' || meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id || meeting_reminder_id || |
| 969 | | || '''Expert''' || expert_name, expert_email, expert_login_provider, expert_password_hash || expert_id || |
| 970 | | || '''Tag_Translate''' || tag_translate_language, tag_value, tag_id || tag_translate_id || |
| 971 | | || '''Course_Translate''' || course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id || course_translate_id || |
| 972 | | || '''Course_Content_Translate''' || content_translate_title, content_translate_language, course_content_id || course_content_translate_id || |
| 973 | | || '''Course_Lecture_Translate''' || lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id || course_lecture_translate_id || |
| 974 | | || '''User_Course_Progress''' || progress_completed, progress_completed_at, enrollment_id, course_lecture_id || user_course_progress_id || |
| 975 | | || '''User''' || 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_id || |
| 976 | | || '''Course''' || course_image_url, course_color, course_difficulty, course_duration_minutes, course_price || course_id || |
| 977 | | || '''Enrollment''' || enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, user_id, course_version_id, payment_id, review_id || enrollment_id || |
| 978 | | || '''Payment''' || payment_amount, payment_date, payment_method, payment_status, enrollment_id || payment_id || |
| 979 | | || '''Review''' || review_rating, review_comment, review_date, enrollment_id || review_id || |
| 980 | | || '''Tag''' || tag_type || tag_id || |
| 981 | | || '''Course_Version''' || version_number, version_creation_date, version_active, course_id || course_version_id || |
| 982 | | || '''Course_Content''' || content_position, course_version_id || course_content_id || |
| 983 | | || '''Course_Lecture''' || lecture_duration_minutes, lecture_position, lecture_content_type, course_content_id || course_lecture_id || |
| | 973 | || Course_What_Will_Be_Learned || course_translate_id, course_what_will_be_learned || (course_translate_id, course_what_will_be_learned) || |
| | 974 | |
| | 975 | '''2NF Декомпозиција (8 релации):''' |
| | 976 | ||= Релација =||= Атрибути =||= Примарен клуч =|| |
| | 977 | || Verification_Token || verification_token_uuid, token_created_at, token_expired_at, user_id || verification_token_uuid || |
| | 978 | || Meeting_Reminder || meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id || meeting_reminder_id || |
| | 979 | || Expert || expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash || expert_id || |
| | 980 | || Tag_Translate || tag_translate_id, tag_translate_language, tag_value, tag_id || tag_translate_id || |
| | 981 | || Course_Translate || course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id || course_translate_id || |
| | 982 | || Course_Content_Translate || course_content_translate_id, content_translate_title, content_translate_language, course_content_id || course_content_translate_id || |
| | 983 | || Course_Lecture_Translate || course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id || course_lecture_translate_id || |
| | 984 | || User_Course_Progress || user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id || user_course_progress_id || |
| | 985 | |
| | 986 | '''3NF Декомпозиција (9 релации):''' |
| | 987 | ||= Релација =||= Атрибути =||= Примарен клуч =|| |
| | 988 | || User || 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_id || |
| | 989 | || Course || course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price || course_id || |
| | 990 | || Course_Version || course_version_id, version_number, version_creation_date, version_active, course_id || course_version_id || |
| | 991 | || Enrollment || enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, user_id, course_version_id, payment_id, review_id || enrollment_id || |
| | 992 | || Payment || payment_id, payment_amount, payment_date, payment_method, payment_status, enrollment_id || payment_id || |
| | 993 | || Review || review_id, review_rating, review_comment, review_date, enrollment_id || review_id || |
| | 994 | || Tag || tag_id, tag_type || tag_id || |
| | 995 | || Course_Content || course_content_id, content_position, course_version_id || course_content_id || |
| | 996 | || Course_Lecture || course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, course_content_id || course_lecture_id || |
| | 997 | |
| | 998 | '''Дополнителни релации (не од FD декомпозиција):''' |
| | 999 | ||= Релација =||= Атрибути =||= Примарен клуч =||= Извор =|| |
| | 1000 | || User_Tag || user_id, tag_id || (user_id, tag_id) || Many-to-many (ER модел) || |
| | 1001 | || Course_Tag || course_id, tag_id || (course_id, tag_id) || Many-to-many (ER модел) || |
| | 1002 | || Expert_Course || expert_id, course_id || (expert_id, course_id) || Many-to-many (ER модел) || |
| 993 | | ==== R1 (Product) ==== |
| 994 | | |
| 995 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 996 | | || productId → сите || productId || ✓ ДА || |
| 997 | | || product_sku → сите (FD6) || product_sku || ✓ ДА (кандидат клуч) || |
| 998 | | |
| 999 | | '''R1 е во BCNF''' ✓ |
| 1000 | | |
| 1001 | | ==== R2 (Sale) ==== |
| 1002 | | |
| 1003 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1004 | | || saleId → сите || saleId || ✓ ДА || |
| 1005 | | |
| 1006 | | '''R2 е во BCNF''' ✓ |
| 1007 | | |
| 1008 | | ==== R3 (!PurchaseOrder) ==== |
| 1009 | | |
| 1010 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1011 | | || poId → сите || poId || ✓ ДА || |
| 1012 | | |
| 1013 | | '''R3 е во BCNF''' ✓ |
| 1014 | | |
| 1015 | | ==== R4 (!SaleItem) ==== |
| 1016 | | |
| 1017 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1018 | | || {saleId, productId} → сите || {saleId, productId} || ✓ ДА || |
| 1019 | | |
| 1020 | | '''R4 е во BCNF''' ✓ |
| 1021 | | |
| 1022 | | ==== R5 (!PurchaseOrderItem) ==== |
| 1023 | | |
| 1024 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1025 | | || {poId, productId} → сите || {poId, productId} || ✓ ДА || |
| 1026 | | |
| 1027 | | '''R5 е во BCNF''' ✓ |
| 1028 | | |
| 1029 | | ==== R6 (User) ==== |
| 1030 | | |
| 1031 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1032 | | || userId → сите || userId || ✓ ДА || |
| 1033 | | || user_username → сите (FD2) || user_username || ✓ ДА (кандидат клуч) || |
| 1034 | | || user_email → сите (FD3) || user_email || ✓ ДА (кандидат клуч) || |
| 1035 | | |
| 1036 | | '''R6 е во BCNF''' ✓ |
| 1037 | | |
| 1038 | | ==== R7 (Customer) ==== |
| 1039 | | |
| 1040 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1041 | | || customerId → сите || customerId || ✓ ДА || |
| 1042 | | |
| 1043 | | '''R7 е во BCNF''' ✓ |
| 1044 | | |
| 1045 | | ==== R8 (Category) ==== |
| 1046 | | |
| 1047 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1048 | | || categoryId → сите || categoryId || ✓ ДА || |
| 1049 | | |
| 1050 | | '''R8 е во BCNF''' ✓ |
| 1051 | | |
| 1052 | | ==== R9 (Supplier) ==== |
| 1053 | | |
| 1054 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1055 | | || supplierId → сите || supplierId || ✓ ДА || |
| 1056 | | |
| 1057 | | '''R9 е во BCNF''' ✓ |
| 1058 | | |
| 1059 | | ==== R10 (Warehouse) ==== |
| 1060 | | |
| 1061 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1062 | | || warehouseId → сите || warehouseId || ✓ ДА || |
| 1063 | | |
| 1064 | | '''R10 е во BCNF''' ✓ |
| 1065 | | |
| 1066 | | ==== R11 (!WarehouseStock) ==== |
| 1067 | | |
| 1068 | | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| 1069 | | || {warehouseId, productId} → сите || {warehouseId, productId} || ✓ ДА || |
| 1070 | | |
| 1071 | | '''R11 е во BCNF''' ✓ |
| | 1012 | ==== Verification_Token ==== |
| | 1013 | |
| | 1014 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1015 | || verification_token_uuid → сите || verification_token_uuid || ✓ ДА || |
| | 1016 | |
| | 1017 | '''Verification_Token е во BCNF''' ✓ |
| | 1018 | |
| | 1019 | ==== Meeting_Reminder ==== |
| | 1020 | |
| | 1021 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1022 | || meeting_reminder_id → сите || meeting_reminder_id || ✓ ДА || |
| | 1023 | |
| | 1024 | '''Meeting_Reminder е во BCNF''' ✓ |
| | 1025 | |
| | 1026 | ==== Expert ==== |
| | 1027 | |
| | 1028 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1029 | || expert_id → сите || expert_id || ✓ ДА || |
| | 1030 | |
| | 1031 | '''Expert е во BCNF''' ✓ |
| | 1032 | |
| | 1033 | ==== Tag_Translate ==== |
| | 1034 | |
| | 1035 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1036 | || tag_translate_id → сите || tag_translate_id || ✓ ДА || |
| | 1037 | |
| | 1038 | '''Tag_Translate е во BCNF''' ✓ |
| | 1039 | |
| | 1040 | ==== Course_Translate ==== |
| | 1041 | |
| | 1042 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1043 | || course_translate_id → сите || course_translate_id || ✓ ДА || |
| | 1044 | |
| | 1045 | '''Course_Translate е во BCNF''' ✓ |
| | 1046 | |
| | 1047 | ==== Course_Content_Translate ==== |
| | 1048 | |
| | 1049 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1050 | || course_content_translate_id → сите || course_content_translate_id || ✓ ДА || |
| | 1051 | |
| | 1052 | '''Course_Content_Translate е во BCNF''' ✓ |
| | 1053 | |
| | 1054 | ==== Course_Lecture_Translate ==== |
| | 1055 | |
| | 1056 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1057 | || course_lecture_translate_id → сите || course_lecture_translate_id || ✓ ДА || |
| | 1058 | |
| | 1059 | '''Course_Lecture_Translate е во BCNF''' ✓ |
| | 1060 | |
| | 1061 | ==== User_Course_Progress ==== |
| | 1062 | |
| | 1063 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1064 | || user_course_progress_id → сите || user_course_progress_id || ✓ ДА || |
| | 1065 | |
| | 1066 | '''User_Course_Progress е во BCNF''' ✓ |
| | 1067 | |
| | 1068 | ==== User ==== |
| | 1069 | |
| | 1070 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1071 | || user_id → сите || user_id || ✓ ДА || |
| | 1072 | |
| | 1073 | '''User е во BCNF''' ✓ |
| | 1074 | |
| | 1075 | ==== Course ==== |
| | 1076 | |
| | 1077 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1078 | || course_id → сите || course_id || ✓ ДА || |
| | 1079 | |
| | 1080 | '''Course е во BCNF''' ✓ |
| | 1081 | |
| | 1082 | ==== Enrollment ==== |
| | 1083 | |
| | 1084 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1085 | || enrollment_id → сите || enrollment_id || ✓ ДА || |
| | 1086 | |
| | 1087 | '''Enrollment е во BCNF''' ✓ |
| | 1088 | |
| | 1089 | ==== Payment ==== |
| | 1090 | |
| | 1091 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1092 | || payment_id → сите || payment_id || ✓ ДА || |
| | 1093 | |
| | 1094 | '''Payment е во BCNF''' ✓ |
| | 1095 | |
| | 1096 | ==== Review ==== |
| | 1097 | |
| | 1098 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1099 | || review_id → сите || review_id || ✓ ДА || |
| | 1100 | |
| | 1101 | '''Review е во BCNF''' ✓ |
| | 1102 | |
| | 1103 | ==== Tag ==== |
| | 1104 | |
| | 1105 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1106 | || tag_id → сите || tag_id || ✓ ДА || |
| | 1107 | |
| | 1108 | '''Tag е во BCNF''' ✓ |
| | 1109 | |
| | 1110 | ==== Course_Version ==== |
| | 1111 | |
| | 1112 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1113 | || course_version_id → сите || course_version_id || ✓ ДА || |
| | 1114 | |
| | 1115 | '''Course_Version е во BCNF''' ✓ |
| | 1116 | |
| | 1117 | ==== Course_Content ==== |
| | 1118 | |
| | 1119 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1120 | || course_content_id → сите || course_content_id || ✓ ДА || |
| | 1121 | |
| | 1122 | '''Course_Content е во BCNF''' ✓ |
| | 1123 | |
| | 1124 | ==== Course_Lecture ==== |
| | 1125 | |
| | 1126 | ||= FD =||= Детерминант =||= Суперклуч? =|| |
| | 1127 | || course_lecture_id → сите || course_lecture_id || ✓ ДА || |
| | 1128 | |
| | 1129 | '''Course_Lecture е во BCNF''' ✓ |
| | 1130 | |
| 1092 | | Category(categoryId, name, description) |
| 1093 | | - Примарен клуч: categoryId |
| 1094 | | - Кандидат клучеви: categoryId |
| | 1151 | Verification_Token(verification_token_uuid, token_created_at, token_expired_at, user_id) |
| | 1152 | - Примарен клуч: verification_token_uuid |
| | 1153 | - Кандидат клучеви: verification_token_uuid |
| | 1154 | - Надворешни клучеви: user_id |
| | 1155 | |
| | 1156 | Meeting_Reminder(meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id) |
| | 1157 | - Примарен клуч: meeting_reminder_id |
| | 1158 | - Кандидат клучеви: meeting_reminder_id, meeting_link |
| | 1159 | - Надворешни клучеви: user_id |
| | 1160 | |
| | 1161 | Enrollment(enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, user_id, course_version_id, payment_id, review_id) |
| | 1162 | - Примарен клуч: enrollment_id |
| | 1163 | - Кандидат клучеви: enrollment_id |
| | 1164 | - Надворешни клучеви: user_id, course_version_id, payment_id, review_id |
| | 1165 | |
| | 1166 | Payment(payment_id, payment_amount, payment_date, payment_method, payment_status, enrollment_id) |
| | 1167 | - Примарен клуч: payment_id |
| | 1168 | - Кандидат клучеви: payment_id |
| | 1169 | - Надворешни клучеви: enrollment_id |
| | 1170 | |
| | 1171 | Review(review_id, review_rating, review_comment, review_date, enrollment_id) |
| | 1172 | - Примарен клуч: review_id |
| | 1173 | - Кандидат клучеви: review_id |
| | 1174 | - Надворешни клучеви: enrollment_id |
| | 1175 | |
| | 1176 | Course_Version(course_version_id, version_number, version_creation_date, version_active, course_id) |
| | 1177 | - Примарен клуч: course_version_id |
| | 1178 | - Кандидат клучеви: course_version_id |
| | 1179 | - Надворешни клучеви: course_id |
| | 1180 | |
| | 1181 | Course(course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price) |
| | 1182 | - Примарен клуч: course_id |
| | 1183 | - Кандидат клучеви: course_id |
| 1097 | | Supplier(supplierId, name, contact_person, phone, email, address) |
| 1098 | | - Примарен клуч: supplierId |
| 1099 | | - Кандидат клучеви: supplierId |
| | 1186 | Course_Translate(course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id) |
| | 1187 | - Примарен клуч: course_translate_id |
| | 1188 | - Кандидат клучеви: course_translate_id |
| | 1189 | - Надворешни клучеви: course_id |
| | 1190 | |
| | 1191 | Course_Content(course_content_id, content_position, course_version_id) |
| | 1192 | - Примарен клуч: course_content_id |
| | 1193 | - Кандидат клучеви: course_content_id |
| | 1194 | - Надворешни клучеви: course_version_id |
| | 1195 | |
| | 1196 | Course_Content_Translate(course_content_translate_id, content_translate_title, content_translate_language, course_content_id) |
| | 1197 | - Примарен клуч: course_content_translate_id |
| | 1198 | - Кандидат клучеви: course_content_translate_id |
| | 1199 | - Надворешни клучеви: course_content_id |
| | 1200 | |
| | 1201 | Course_Lecture(course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, course_content_id) |
| | 1202 | - Примарен клуч: course_lecture_id |
| | 1203 | - Кандидат клучеви: course_lecture_id |
| | 1204 | - Надворешни клучеви: course_content_id |
| | 1205 | |
| | 1206 | Course_Lecture_Translate(course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id) |
| | 1207 | - Примарен клуч: course_lecture_translate_id |
| | 1208 | - Кандидат клучеви: course_lecture_translate_id |
| | 1209 | - Надворешни клучеви: course_lecture_id |
| | 1210 | |
| | 1211 | User_Course_Progress(user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id) |
| | 1212 | - Примарен клуч: user_course_progress_id |
| | 1213 | - Кандидат клучеви: user_course_progress_id |
| | 1214 | - Надворешни клучеви: enrollment_id, course_lecture_id |
| | 1215 | |
| | 1216 | Tag(tag_id, tag_type) |
| | 1217 | - Примарен клуч: tag_id |
| | 1218 | - Кандидат клучеви: tag_id |
| 1102 | | Warehouse(warehouseId, name, location, capacity) |
| 1103 | | - Примарен клуч: warehouseId |
| 1104 | | - Кандидат клучеви: warehouseId |
| 1105 | | - Надворешни клучеви: - |
| 1106 | | |
| 1107 | | Product(productId, name, description, sku, unit_price, reorder_level, categoryId, supplierId) |
| 1108 | | - Примарен клуч: productId |
| 1109 | | - Кандидат клучеви: productId, sku |
| 1110 | | - Надворешни клучеви: categoryId → Category, supplierId → Supplier |
| 1111 | | |
| 1112 | | Sale(saleId, date_time, total_amount, userId, customerId, warehouseId) |
| 1113 | | - Примарен клуч: saleId |
| 1114 | | - Кандидат клучеви: saleId |
| 1115 | | - Надворешни клучеви: userId → User, customerId → Customer, warehouseId → Warehouse |
| 1116 | | |
| 1117 | | PurchaseOrder(poId, order_date, expected_delivery_date, status, supplierId, warehouseId) |
| 1118 | | - Примарен клуч: poId |
| 1119 | | - Кандидат клучеви: poId |
| 1120 | | - Надворешни клучеви: supplierId → Supplier, warehouseId → Warehouse |
| 1121 | | |
| 1122 | | SaleItem(saleId, productId, quantity, unit_price_at_sale) |
| 1123 | | - Примарен клуч: {saleId, productId} |
| 1124 | | - Кандидат клучеви: {saleId, productId} |
| 1125 | | - Надворешни клучеви: saleId → Sale, productId → Product |
| 1126 | | |
| 1127 | | PurchaseOrderItem(poId, productId, quantity, unit_cost) |
| 1128 | | - Примарен клуч: {poId, productId} |
| 1129 | | - Кандидат клучеви: {poId, productId} |
| 1130 | | - Надворешни клучеви: poId → PurchaseOrder, productId → Product |
| 1131 | | |
| 1132 | | WarehouseStock(warehouseId, productId, quantity_on_hand, last_updated) |
| 1133 | | - Примарен клуч: {warehouseId, productId} |
| 1134 | | - Кандидат клучеви: {warehouseId, productId} |
| 1135 | | - Надворешни клучеви: warehouseId → Warehouse, productId → Product |
| | 1221 | Tag_Translate(tag_translate_id, tag_translate_language, tag_value, tag_id) |
| | 1222 | - Примарен клуч: tag_translate_id |
| | 1223 | - Кандидат клучеви: tag_translate_id |
| | 1224 | - Надворешни клучеви: tag_id |
| | 1225 | |
| 1140 | | Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''истите 11 релации''' како во концептуалниот модел од Фаза P2. Ова покажува дека: |
| 1141 | | |
| 1142 | | 1. '''Концептуалниот модел беше правилно дизајниран''' - ентитетите и нивните атрибути беа логички групирани. |
| | 1230 | Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''20 релации''' |
| | 1231 | (17 од функционални зависности + 3 many-to-many junction tables). Споредбата со концептуалниот модел |
| | 1232 | од Фаза P2 покажува следно: |
| | 1233 | |
| | 1234 | ==== Релации кои се идентични со P2 ==== |
| | 1235 | |
| | 1236 | Следниве релации се '''целосно идентични''' со оние од концептуалниот ER модел: |
| | 1237 | |
| | 1238 | 1. '''User''' - идентична структура и атрибути |
| | 1239 | 2. '''Expert''' - идентична структура и атрибути |
| | 1240 | 3. '''Course''' - идентична структура и атрибути |
| | 1241 | 4. '''Course_Version''' - идентична структура и атрибути |
| | 1242 | 5. '''Enrollment''' - идентична структура и атрибути |
| | 1243 | 6. '''Payment''' - идентична структура и атрибути (one-to-one со Enrollment) |
| | 1244 | 7. '''Review''' - идентична структура и атрибути (one-to-one со Enrollment) |
| | 1245 | 8. '''Tag''' - идентична структура и атрибути |
| | 1246 | 9. '''Course_Translate''' - идентична структура и атрибути |
| | 1247 | 10. '''Course_Content''' - идентична структура и атрибути |
| | 1248 | 11. '''Course_Content_Translate''' - идентична структура и атрибути |
| | 1249 | 12. '''Course_Lecture''' - идентична структура и атрибути |
| | 1250 | 13. '''Course_Lecture_Translate''' - идентична структура и атрибути |
| | 1251 | 14. '''Tag_Translate''' - идентична структура и атрибути |
| | 1252 | 15. '''Verification_Token''' - идентична структура и атрибути |
| | 1253 | 16. '''Meeting_Reminder''' - идентична структура и атрибути |
| | 1254 | 17. '''User_Course_Progress''' - идентична структура и атрибути |
| | 1255 | |
| | 1256 | ==== Many-to-Many релации ==== |
| | 1257 | |
| | 1258 | 18. '''Expert_Course''' - junction table за many-to-many релација помеѓу Expert и Course |
| | 1259 | 19. '''Course_Tag''' - junction table за many-to-many релација помеѓу Course и Tag |
| | 1260 | 20. '''User_Tag''' (User_Favorite_Course_Ids во P2) - junction table за many-to-many релација помеѓу User и Tag/Course |
| | 1261 | |
| | 1262 | ==== Релација со мултивредносен атрибут ==== |
| | 1263 | |
| | 1264 | * '''Course_What_Will_Be_Learned''' - беше дел од Course_Translate во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден курс има повеќе "what will be learned" ставки). |
| | 1265 | |
| | 1266 | ==== Клучни наоди ==== |
| | 1267 | |
| | 1268 | 1. '''Концептуалниот модел беше правилно дизајниран''' - 17 од 17 ентитети од ER моделот соодветствуваат на релациите добиени преку нормализација. Ова покажува дека оригиналниот дизајн ги почитуваше принципите на нормализација уште во концептуалната фаза. |
| 1146 | | 3. '''Клучот на универзалната релација {saleId, poId, productId}''' беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна. |
| 1147 | | |
| 1148 | | 4. '''Сите релации се во BCNF''' - нема функционална зависност каде детерминантот не е суперклуч. |
| 1149 | | |
| 1150 | | 5. '''Декомпозицијата е lossless''' - оригиналната информација може да се реконструира. |
| 1151 | | |
| 1152 | | 6. '''Сите функционални зависности се зачувани''' - секоја FD е зачувана во барем една од финалните релации. |
| | 1272 | 3. '''Клучот на универзалната релација''' - примарниот клуч беше идентификуван како композитен клуч од 8 атрибути: {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, course_what_will_be_learned}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите. |
| | 1273 | |
| | 1274 | 4. '''Мултивредносни атрибути''' - концептуалниот модел имаше еден мултивредносен атрибут (course_what_will_be_learned) кој беше правилно идентификуван и декомпониран во 1NF фазата. |
| | 1275 | |
| | 1276 | 5. '''Сите релации се во BCNF''' - после анализа на сите 20 релации, потврдено е дека нема функционална зависност каде детерминантот не е суперклуч. Ова значи дека не е потребна дополнителна декомпозиција. |
| | 1277 | |
| | 1278 | 6. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys). |
| | 1279 | |
| | 1280 | 7. '''Сите функционални зависности се зачувани''' - сите 27 функционални зависности (FD1-FD27) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции. |
| | 1281 | |
| | 1282 | 8. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys. |
| | 1283 | |
| | 1284 | ==== Заклучок ==== |
| | 1285 | |
| | 1286 | Процесот на нормализација '''целосно го потврди дизајнот''' од концептуалната фаза (P2). Не беа потребни |
| | 1287 | значајни промени - единствената декомпозиција беше издвојувањето на мултивредносниот атрибут course_what_will_be_learned во посебна релација. Ова покажува дека оригиналниот ER модел беше креиран според |
| | 1288 | принципите на добра база на податоци (минимална редундантност, јасна сепарација на концепти, правилна идентификација на ентитети и релации). |
| | 1289 | |
| | 1290 | '''Финалниот релационен модел ќе биде идентичен со моделот од Фаза P2'''. |