= Nutritioneer | Нормализација и оптимизација на дизајн == Денормализирана форма Рамна табела од сите ентитети на Nutritioneer и нивните врски, без структурни ограничувања. Повеќевредносните факти се присутни како групи што се повторуваат: еден рецепт има многу состојки, многу диететски ограничувања и многу коментари, а една состојка носи многу нутриенти. === Функционални зависности * user_id → email, username, password, role * email → user_id (алтернативен клуч, UNIQUE) * username → user_id (алтернативен клуч, UNIQUE) * ingredient_id → ingredient_name, ingr_description, energy, kcal, ingr_type * ingredient_name → ingredient_id (алтернативен клуч, UNIQUE) * nutrient_id → nutr_description, rdi_quantity, unit, nutr_type * nutr_description → nutrient_id (алтернативен клуч, UNIQUE) * restriction_id → restr_description, restr_type * restr_description → restriction_id (алтернативен клуч, UNIQUE) * recipe_id → recipe_name, guide, kcal_sum, servings, user_id * post_id → media, media_type, media_name, is_private, is_favourite, status, post_created_at, user_id, recipe_id * recipe_id → post_id (POSTS_ON е 1:1, UNIQUE врз recipe_id) * comment_id → comment_text, comment_created_at, post_id, user_id * list_id → list_date_time, list_notes, is_bought, list_kcal, user_id * planner_id → planner_date_time, planner_notes, planner_kcal, is_consumed, user_id * bio_id → bio_date, weight, height, age, muscle_fat_ratio, user_id * {user_id, bio_date} → bio_id (едно мерење по корисник на ден) * {recipe_id, ingredient_id} → ingredient_quantity * {ingredient_id, nutrient_id} → nutrient_amount * {list_id, ingredient_id} → buy_quantity === Чисти M:N врски Врските како recipe - restriction и grocery_list - grocery_list_bulk_add_ingredient неможат да определат дополнителен атрибут. Не се функционални зависности. === Почетна денормализирана релација {{{ R( user_id, email, username, password, role, ingredient_id, ingredient_name, ingr_description, energy, kcal, ingr_type, nutrient_id, nutr_description, rdi_quantity, unit, nutr_type, restriction_id, restr_description, restr_type, recipe_id, recipe_name, guide, kcal_sum, servings, post_id, media, media_type, media_name, is_private, is_favourite, status, post_created_at, comment_id, comment_text, comment_created_at, list_id, list_date_time, list_notes, is_bought, list_kcal, planner_id, planner_date_time, planner_notes, planner_kcal, is_consumed, bio_id, bio_date, weight, height, age, muscle_fat_ratio, ingredient_quantity, nutrient_amount, buy_quantity ) }}} === Кандидат-клуч 1.X+ = R 2.X е минимално Кандидати клучеви се следните: {{{ K = { comment_id, ingredient_id, nutrient_id, restriction_id, list_id, planner_id, bio_id } }}} Атрибут што не се појавува на десната страна на ниедна функционална зависност никогаш не може да биде изведен, па мора да припаѓа на секој клуч. Пресметка на затворањето на K: * comment_id → post_id, user_id; post_id → recipe_id; recipe_id → атрибути на рецептот; user_id → атрибути на корисникот * ingredient_id → атрибути на состојката; {recipe_id, ingredient_id} → ingredient_quantity * nutrient_id → атрибути на нутриентот; {ingredient_id, nutrient_id} → nutrient_amount * restriction_id, list_id, planner_id, bio_id → нивните гранки; {list_id, ingredient_id} → buy_quantity === Проверка на минималност 1. Отстранување на comment_id -> Се губи крајот на синџирот коментар → објава → рецепт → корисник. 2. Отстранување на ingredient_id -> Се губи каталогот на храна, а со него и сите три атрибути за количина на врските. 3. Oтстранување на nutrient_id -> Се губи гранката на нутриенти и nutrient_amount. 4. Oтстранување на restriction_id -> Се губи гранката на диететски ознаки 5. Oтстранување на list_id, planner_id или bio_id -> Се губат соодветните ентитети. Ниедна од нив не е определена од ништо друго. === Примерок од денормализирани податоци Истиот корисник, рецепт, состојка и количина на нутриент се повторуваат по еднаш за секој коментар и по еднаш за секое ограничување. Промена на име на рецепт би барала ажурирање на секој од овие редови — **аномалија при промена** — а бришењето на последниот коментар би го избришало и фактот дека рецептот содржи бел грав — **аномалија при бришење.** ||= username =||= recipe name =||= ingredient name =||= nutrient descr =||= nutrient amount =||= restriction type =||= comment =|| || marija_t || Tavce Gravce || Dry White Beans || Protein || 21.0 || vegan || How long should I let it simmer and soak? || || marija_t || Tavce Gravce || Dry White Beans || Protein || 21.0 || vegan || How long should you keep stirring the pot? || || marija_t || Tavce Gravce || Dry White Beans || Protein || 21.0 || gluten_free || What is in the sauce? || === ПРВА(1NF) === ВТОРА(2NF) === ТРЕТА(3NF) === БОЈС-КОДОВА (BCNF) == Навигација низ проектот [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/WikiStart Почетна страна] ||= Фаза =||= Име на фаза =||= Статус =|| || P0 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/About Дефинирање проект] || Одобрен || || P1 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/ERModel Концептуален дизајн и ЕР Дијаграм] || Одобрен || || P2 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/RelationalDesign Логички и физички дизајн - DDL] || Одобрен || || P3 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/UseCaseModel Кориснички/апикациски сценарија со базата на податоци] || Одобрен || || P4 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/PrototypeApplication Протип со основни функционалности] || WIP || || М1 || Презентација на прототип || WIP || || P5 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/Normalization Нормализација и оптимизација на дизајн] || WIP || || P6 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/AdvancedReports Напредни извештаи од базата] || WIP || || P7 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/AdvancedDatabaseDevelopment Понапреден развој на базата] || WIP || || P8 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/AdvancedApplicationDevelopment Напреден апликативен развој] || WIP || || P9 || [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/OtherDevelopment Дополнителни имплементации] || WIP || || М2 || Финализиран проект || WIP || === ^([#hn Trac навигација]) * TracGuide Documentation