| | 1006 | |
| | 1007 | |
| | 1008 | |
| | 1009 | |
| | 1010 | |
| | 1011 | |
| | 1012 | |
| | 1013 | == Анализа и оптимизација на `User_Order_History` |
| | 1014 | |
| | 1015 | Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции ('''COUNT''' и '''AVG'''), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата. |
| | 1016 | |
| | 1017 | {{{ |
| | 1018 | |
| | 1019 | CREATE MATERIALIZED VIEW "User_Order_History" AS |
| | 1020 | SELECT u.user_id, |
| | 1021 | u.username, |
| | 1022 | o.order_id, |
| | 1023 | o.order_time, |
| | 1024 | o.order_amount, |
| | 1025 | COALESCE(items.total_items_ordered, 0) AS total_items_ordered, |
| | 1026 | COALESCE(items.total_items_refunded, 0) AS total_items_refunded, |
| | 1027 | COALESCE(items.total_amount_refunded, 0.00) AS total_amount_refunded |
| | 1028 | FROM "User" u |
| | 1029 | JOIN "Regular_User" ru ON u.user_id = ru.user_id |
| | 1030 | JOIN "Ticket_Order" o ON ru.user_id = o.user_id |
| | 1031 | LEFT JOIN ( |
| | 1032 | SELECT |
| | 1033 | toi.order_id, |
| | 1034 | COUNT(toi.order_item_id) AS total_items_ordered, |
| | 1035 | COUNT(tri.refund_item_id) AS total_items_refunded, |
| | 1036 | SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded |
| | 1037 | FROM "Ticket_Order_Item" toi |
| | 1038 | LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id |
| | 1039 | GROUP BY toi.order_id |
| | 1040 | ) items ON o.order_id = items.order_id; |
| | 1041 | |
| | 1042 | }}} |
| | 1043 | |
| | 1044 | Погледот е веќе најоптимално напишан и не треба да се преуредува. |
| | 1045 | |
| | 1046 | ==== 1. Примарен филтер: |
| | 1047 | |
| | 1048 | `user_id` (за преглед на лична историја на нарачки). |
| | 1049 | |
| | 1050 | ==== 2. Случај на употреба: |
| | 1051 | |
| | 1052 | Овозможување на корисниците да ги видат сите свои минати купувања, како и следење на статусот на рефундациите. |
| | 1053 | |
| | 1054 | ==== 3. Оптимизација: |
| | 1055 | |
| | 1056 | Користењето на под-прашалник ('''Subquery''') за агрегација на `Ticket_Order_Item` е најчист начин за пресметка на `total_items_refunded`. Бидејќи ова е аналитички поглед, тој е дизајниран да ја избегне сложената логика во реално време, па затоа е најдобро да остане непроменет. |