= Функции, Процедури и Тригери = == Функции == Во системот се имплементирани функции кои се користат за пресметка на статистички податоци и добивање информации поврзани со рецепти и форум објави. === get_forumpost_comments_count === Ја враќа вкупната бројка на коментари за одреден форум пост. * Влезен параметар: `p_forumpost_id` * Излез: број на коментари === get_forumpost_likes_count === Ја враќа вкупната бројка на лајкови за одреден форум пост. * Влезен параметар: `p_forumpost_id` * Излез: број на лајкови === get_total_recipes_by_cuisine === Го пресметува бројот на рецепти за избран тип на кујна. * Влезен параметар: `p_cuisine_id` * Излез: број на рецепти === get_total_recipes_by_category === Го пресметува бројот на рецепти во дадена категорија. * Влезен параметар: `p_category_id` * Излез: број на рецепти === is_quick_recipe === Проверува дали рецептот може да се подготви за најмногу 30 минути. * Влезен параметар: `p_recipe_id` * Излез: TRUE/FALSE == Процедури == Процедурите се користат за централизирано извршување на бизнис логиката и заштита на интегритетот на податоците. === add_recipe_review === Овозможува додавање рецензија за рецепт. Пред внесување се проверува: * дали корисникот го има пробано рецептот * дали веќе има оставено рецензија * дали оцената е во дозволени граници (1-5) === add_forum_comment === Додава нов коментар на форум пост. Се проверува: * дали содржината не е празна * дали форум постот постои === add_recipe_to_favorites === Додава рецепт во листата на омилени рецепти на корисникот. Се спречува двојно додавање на ист рецепт. === add_recipe_attempt === Евидентира дека корисникот го има подготвено рецептот. Се спречува повеќекратно означување на истиот рецепт. === remove_recipe_from_favorites === Го отстранува рецептот од листата на омилени рецепти. === delete_forum_comment === Овозможува бришење на форум коментар. Пред бришење се проверува дали коментарот постои. === add_recipe_dislike === Додава dislike на рецепт. Се спречува повеќекратно додавање dislike од ист корисник. === remove_recipe_dislike === Го отстранува претходно додадениот dislike. === add_forumpost_like === Додава like на форум пост. Се спречува двојно лајкнување на ист пост од ист корисник. == Тригери == Тригерите автоматски се активираат при INSERT операции и обезбедуваат автоматско пополнување на временски ознаки. === trg_set_comment_created_at === Табела: `forumpost_comment` Автоматски го поставува полето `created_at` при креирање на нов коментар доколку вредноста не е внесена. === trg_set_forumpost_created_at === Табела: `forumpost` Автоматски го поставува полето `created_at` при креирање на нов форум пост доколку вредноста не е внесена. === trg_set_recipe_attempt_time === Табела: `recipe_attempt` Автоматски го поставува времето на подготовка во полето `attempted_at` при внесување нов запис. ==== Materialized Views ==== За дополнителна оптимизација беа креирани materialized views за често користени статистички податоци како просечна оцена, број на прегледи и број на омилени рецепти. Користени materialized views: * recipe_reviews_mv * recipe_views_mv * recipe_favorites_mv Оптимизација: {{{ CREATE MATERIALIZED VIEW recipe_reviews_mv AS SELECT recipe_id, recipe, AVG(rating) AS average_rating, COUNT(id) AS total_reviews FROM recipe_reviews_view GROUP BY recipe_id, recipe; CREATE MATERIALIZED VIEW recipe_views_mv AS SELECT recipe_id, recipe, COUNT(user_id) AS total_views FROM recipe_views_view GROUP BY recipe_id, recipe; CREATE MATERIALIZED VIEW recipe_favorites_mv AS SELECT recipe_id, recipe, COUNT(user_id) AS total_favorites FROM user_favorites_view GROUP BY recipe_id, recipe; }}} Заклучок: Materialized views овозможуваат побрзо прикажување на агрегирани податоци бидејќи резултатите се зачувуваат физички во базата и не се пресметуваат повторно при секое извршување. == Заклучок == Во системот се имплементирани: * 5 кориснички функции * 9 процедури * 3 тригери Овие механизми овозможуваат централизирано извршување на бизнис логиката, автоматско пополнување на временски ознаки, спречување на дупликати и одржување на интегритетот на податоците во базата.