Changes between Version 41 and Version 42 of Индекси


Ignore:
Timestamp:
06/16/25 15:16:33 (25 hours ago)
Author:
183175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Индекси

    v41 v42  
    8686\\
    8787
    88 = '''1. Индекси на {{{stock}}} табелата'''
     88= '''1. Индекси на {{{stock}}} табела'''
    8989Во документот app.js имам поставено на почеток два индекси \\
    9090Кои се користат при пребарување залиха за одреден производ и големина (како во /order endpoint) како и во\\
     
    115115\\
    116116
    117 = '''2. Индекси на {{{products}}} табелата'''\\
     117= '''2. Индекси на {{{products}}} табела'''\\
    118118Во документот app.js имам поставено основен индекс на примарниот клуч {{{id_product}}}.\\
    119119{{{#!sql
     
    166166Индекс на {{{email}}} ке го забрза пребарувањето на корисници при најава и регистрација.\\
    167167Индекс на {{{id_role}}} го забрзува филтрирањето по улога, односно дали е корисник или админ.\\
     168Бидејки веќе користиме
     169{{{#!sql
     170SELECT * FROM customers WHERE email = $1
     171UPDATE customers SET id_role = $1 WHERE id_customer = $2
     172}}}
     173\\
    168174Додаваме овој дел во редот на индекси во '''db.pool.query''' во '''app.js''' :
    169175{{{#!sql
     
    172178}}}
    173179\\
     180= '''4. Индекси на {{{orders}}} табела'''\\
     181Поради филтрирањата на admin панелот кои ги правиме и делот {{{/admin/reports}}} \\
     182кои се филтрираат по order_date (неделно, месечно, годишно) преку следниот ред :
     183{{{#!sql
     184// --- Админ API: Извештаи за нарачки ---
     185app.get('/admin/reports', authenticateToken, authorizeAdmin, async (req, res) => {
     186  const filter = req.query.filter; // weekly, monthly, yearly
     187  let query;
     188
     189  if (filter === 'weekly') {
     190    query = `
     191      SELECT COUNT(*) AS total_orders, COALESCE(SUM(total_price), 0) AS total_revenue
     192      FROM orders
     193      WHERE order_date >= NOW() - INTERVAL '7 days'
     194    `;
     195  } else if (filter === 'monthly') {
     196    query = `
     197      SELECT COUNT(*) AS total_orders, COALESCE(SUM(total_price), 0) AS total_revenue
     198      FROM orders
     199      WHERE order_date >= NOW() - INTERVAL '1 month'
     200    `;
     201  } else if (filter === 'yearly') {
     202    query = `
     203      SELECT COUNT(*) AS total_orders, COALESCE(SUM(total_price), 0) AS total_revenue
     204      FROM orders
     205      WHERE order_date >= NOW() - INTERVAL '1 year'
     206    `;
     207  } else {
     208    return res.status(400).json({ error: 'Невалиден филтер' });
     209  }
     210
     211  try {
     212    const result = await db.pool.query(query);
     213    res.json(result.rows[0]);
     214  } catch (err) {
     215    console.error(err);
     216    res.status(500).json({ error: 'Грешка при вчитување на извештај' });
     217  }
     218});
     219}}}
     220\\
     221Го додаваме следниов индекс, кој го забрзува времето за филтирањето и посебно ако направиме посложени филтрирања :\\
     222{{{#!sql
     223CREATE INDEX idx_orders_order_date ON orders(order_date);
     224}}}
     225\\
     226= '''5. Индекси на {{{contains}}} табела'''\\
     227Овде често користиме {{{id_order}}} и {{{id_stock}}} за поврзување со '''orders''' и '''stock'''
     228Затоа ке креираме индекс :
     229{{{#!sql
     230CREATE INDEX idx_contains_order ON contains(id_order);
     231CREATE INDEX idx_contains_stock ON contains(id_stock);
     232}}}
     233\\